Форум программистов, компьютерный форум CyberForum.ru

Не получается найти ошибку в проге. Компилятор ругается на strcopy_s. - C++

Восстановить пароль Регистрация
 
Hesh00
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 11
01.03.2012, 00:29     Не получается найти ошибку в проге. Компилятор ругается на strcopy_s. #1
Сабж.
Есть прога, которая сортирует строки (по Кернигану/Ритчи). Компилятор ругается на strcopy_s, но что-то мне кажется, ошибка в другом. Помогите пожалуйста.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <stdio.h>
#include <string.h>
 
#define MAXLINES 5000 /* максимальное число строк */
 
char *lineptr[MAXLINES]; /* указатели на строки */
 
int readlines(char *lineptr[], int nlines);
void writelines(char *lineptr[], int nlines);
void qsort(char *lineptr[], int left, int right);
 
/* swap: поменять местами v[i] и v[j] */
void swap(char *v[], int i, int j)
{
    char *temp;
    temp = v[i];
    v[i] = v[j];
    v[j] = temp;
}
 
/* qsort: сортирует v[left]...v[right] по возрастанию */
void qsort(char *v[], int left, int right)
{
    int i, last;
    void swap(char *v[], int i, int j);
 
 
    if (left >= right) /* ничего не делается, если в массиве */
        return;        /* менее двух элементов */
 
    swap(v, left, (left+right)/2);
    last = left;
    for(i = left+1; i <= right; i++)
        if (strcmp(v[i], v[left]) < 0)
            swap(v, ++last, i);
    swap(v, left, last);
    qsort(v, left, last-1);
    qsort(v, last+1, right);
}
 
 
/* сортировка строк */
main()
{
    int nlines; /* количество прочитанных строк */
 
    if ((nlines = readlines(lineptr, MAXLINES)) >= 0) {
        qsort(lineptr, 0, nlines-1);
        writelines(lineptr, nlines);
        return 0;
    } else {
        printf("ошибка: слишком много строк\n");
        return 1;
    }
}
 
#define MAXLEN 1000 /* максимальная длина строки */
int getline(char *, int);
char *alloc(int);
 
/* readlines: чтение строк */
int readlines(char *lineptr[], int maxlines)
{
    int len, nlines;
    char *p, line[MAXLEN];
 
    nlines = 0;
    while ((len = getline(line, MAXLEN)) > 0)
        if (nlines >= maxlines || (p = alloc(len)) == NULL)
            return -1; 
        else {
            line[len-1] = '\0'; /* убираем символ \n */
            strcpy(p, line);
            lineptr[nlines++] = p;
        } 
    return nlines;
}
 
/* writelines: печать строк */
void writelines(char *lineptr[], int nlines)
{
    int i;
    for (i = 0; i < nlines; i++)
        printf("%s\n", lineptr[i]);
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.03.2012, 00:29     Не получается найти ошибку в проге. Компилятор ругается на strcopy_s.
Посмотрите здесь:

C++ народ,кто может найти ошибку в проге??
Ругается компилятор C++
Найти ошибку в рабочей проге C++
ругается компилятор: C++
Не могу найти ошибку в проге C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
01.03.2012, 02:06
  #2

Не по теме:

Цитата Сообщение от Hesh00 Посмотреть сообщение
int i, last;
* * void swap(char *v[], int i, int j);
- чё это за бред заголовок одной функции внутри тела другой, неужели в книге так было написано???О_о
Цитата Сообщение от Hesh00 Посмотреть сообщение
char *alloc(int);
- а это собственно что?
(тоже на ошибку смахивает)

Nameless One
Эксперт С++
 Аватар для Nameless One
5754 / 3403 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
01.03.2012, 05:33     Не получается найти ошибку в проге. Компилятор ругается на strcopy_s. #3
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- чё это за бред заголовок одной функции внутри тела другой, неужели в книге так было написано???
это абсолютно корректный код (правда, он там не нужен, т.к. функция объявлена выше)

Hesh00, чем комплируешь?
-=ЮрА=-
Заблокирован
Автор FAQ
01.03.2012, 10:29     Не получается найти ошибку в проге. Компилятор ругается на strcopy_s. #4
Цитата Сообщение от Nameless One Посмотреть сообщение
это абсолютно корректный код
- я не против, против мой компилятор
Compiling...
main.cpp
Linking...
main.obj : error LNK2001: unresolved external symbol "char * __cdecl alloc(int)" (?alloc@@YAPADH@Z)
main.obj : error LNK2001: unresolved external symbol "int __cdecl getline(char *,int)" (?getline@@YAHPADH@Z)
Debug/compile_.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.

compile_.exe - 3 error(s), 0 warning(s)
Сейчас поищу за прототип alloc, возможно хедер какой-то не подключен
getline - а это вообще из плюсов, получается что суржик С/С++ коректный???

Добавлено через 5 минут

Не по теме:

Nameless One, пишу лишь своё мнение, никого обидеть не хочу - код полный ацтой, да именно полный ацтой ИМХО(в коде переплелись и Си и С++, это уже плохой стиль программирования). Hesh00, изложи задание и укажи язык попробую написать компактней понятней и продуктивней. Честно не охота по функциям вникать что код там делает.

Nameless One
Эксперт С++
 Аватар для Nameless One
5754 / 3403 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
01.03.2012, 14:43     Не получается найти ошибку в проге. Компилятор ругается на strcopy_s. #5
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
getline - а это вообще из плюсов, получается что суржик С/С++ коректный???
man getline
Код
GETLINE(3)                                                                               Linux Programmer's Manual                                                                               GETLINE(3)



NAME
       getline, getdelim - delimited string input

SYNOPSIS
       #include <stdio.h>

       ssize_t getline(char **lineptr, size_t *n, FILE *stream);

       ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream);

   Feature Test Macro Requirements for glibc (see feature_test_macros(7)):

       getline(), getdelim():
           Since glibc 2.10:
               _POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700
           Before glibc 2.10:
               _GNU_SOURCE

DESCRIPTION
       getline()  reads  an  entire  line  from  stream, storing the address of the buffer containing the text into *lineptr.  The buffer is null-terminated and includes the newline character, if one was
       found.

       If *lineptr is NULL, then getline() will allocate a buffer for storing the line, which should be freed by the user program.  (In this case, the value in *n is ignored.)

       Alternatively, before calling getline(), *lineptr can contain a pointer to a malloc(3)-allocated buffer *n bytes in size.  If the buffer is not large enough to hold the line, getline() resizes  it
       with realloc(3), updating *lineptr and *n as necessary.

       In either case, on a successful call, *lineptr and *n will be updated to reflect the buffer address and allocated size respectively.

       getdelim()  works  like getline(), except that a line delimiter other than newline can be specified as the delimiter argument.  As with getline(), a delimiter character is not added if one was not
       present in the input before end of file was reached.

RETURN VALUE
       On success, getline() and getdelim() return the number of characters read, including the delimiter character, but not including the terminating null byte.  This value can be used to handle  embed‐
       ded null bytes in the line read.

       Both functions return -1  on failure to read a line (including end-of-file condition).

ERRORS
       EINVAL Bad arguments (n or lineptr is NULL, or stream is not valid).

VERSIONS
       These functions are available since libc 4.6.27.

CONFORMING TO
       Both getline() and getdelim() were originally GNU extensions.  They were standardized in POSIX.1-2008.

EXAMPLE
       #define _GNU_SOURCE
       #include <stdio.h>
       #include <stdlib.h>

       int
       main(void)
       {
           FILE *fp;
           char *line = NULL;
           size_t len = 0;
           ssize_t read;

           fp = fopen("/etc/motd", "r");
           if (fp == NULL)
               exit(EXIT_FAILURE);

           while ((read = getline(&line, &len, fp)) != -1) {
               printf("Retrieved line of length %zu :\n", read);
               printf("%s", line);
           }

           free(line);
           exit(EXIT_SUCCESS);
       }

SEE ALSO
       read(2), fgets(3), fopen(3), fread(3), gets(3), scanf(3)

COLOPHON
       This page is part of release 3.32 of the Linux man-pages project.  A description of the project, and information about reporting bugs, can be found at http://www.kernel.org/doc/man-pages/.



GNU                                                                                              2010-06-12                                                                                      GETLINE(3)

это С-ная функция, правда нестандартная (описана стандартом POSIX и должна присутствовать на любой POSIX-совместимой системе — LInux, Maс, BSD).
А про alloc и моя система не знает. Вместо него, очевидно, нужно использовать malloc.
-=ЮрА=-
01.03.2012, 14:55     Не получается найти ошибку в проге. Компилятор ругается на strcopy_s.
  #6

Не по теме:

Цитата Сообщение от Nameless One Посмотреть сообщение
(описана стандартом POSIX и должна присутствовать на любой POSIX-совместимой системе — LInux, Maс, BSD).
- ну дык посчитал что об NT платформе речь идёт, автор не уточнил ОС. Тем не меннее рассматриваемый в топике код очень далёк от совершенства...

Yandex
Объявления
01.03.2012, 14:55     Не получается найти ошибку в проге. Компилятор ругается на strcopy_s.
Ответ Создать тему
Опции темы

Текущее время: 16:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru