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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Hesh00
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 11
#1

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

01.03.2012, 00:29. Просмотров 478. Ответов 5
Метки нет (Все метки)

Сабж.
Есть прога, которая сортирует строки (по Кернигану/Ритчи). Компилятор ругается на 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]);
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.03.2012, 00:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не получается найти ошибку в проге. Компилятор ругается на strcopy_s. (C++):

Найти ошибку в рабочей проге - C++
Всем привет! Помогите решить небольшую проблему: рабочая программа, но результат почему то выводит не тот, что надо, а точнее вообще не...

Не могу найти ошибку в проге - C++
#include &lt;Windows.h&gt; #include &lt;iostream&gt; using namespace std; class prom { private: int a,b,n,m,r,c; ...

народ,кто может найти ошибку в проге?? - C++
#include &lt;stdio.h&gt; #include &lt;string.h&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; void File_input(); void File_output(int n); ...

Компилятор ругается - C++
Условие Создать класс, содержащий сведения о количестве изделий, собранный сборщиками цеха за неделю. Класс должен содержать следующие...

ругается компилятор: - C++
#include &lt;stdio.h&gt; #include &lt;iostream&gt; #include &lt;process.h&gt; #include &lt;conio.h&gt; #include &lt;math.h&gt; float a,b; ...

Компилятор не ругается - C++
Компилятор по разному реагирует на 2 указателя на строки (см.комментарии). В связи с этим появился вопрос - где хранятся аргументы...

5
-=ЮрА=-
01.03.2012, 02:06
  #2

Не по теме:

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

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

Hesh00, чем комплируешь?
0
-=ЮрА=-
Заблокирован
Автор FAQ
01.03.2012, 10:29 #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, изложи задание и укажи язык попробую написать компактней понятней и продуктивней. Честно не охота по функциям вникать что код там делает.

0
Nameless One
Эксперт С++
5774 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
01.03.2012, 14:43 #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.
0
-=ЮрА=-
01.03.2012, 14:55     Не получается найти ошибку в проге. Компилятор ругается на strcopy_s.
  #6

Не по теме:

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

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.03.2012, 14:55
Привет! Вот еще темы с ответами:

Ругается компилятор - C++
Компилирую программу: // Proba2.cpp: определяет точку входа для консольного приложения. // #include &quot;stdafx.h&quot; #include &lt;vector&gt;...

Ругается компилятор - C++
Создать класс жидкость, имеющий название (указатель на строку), плотность. Определить конструкторы, деструктор и операторы вывода в поток....

не работет программа или функция, не могу найти ошибку, ругается не неправильные указатели - C++
суть программы, вводится строка, с клавиатуры задается число, если есть слова в строке, в которых есть заданное число случайных цифр, то...

Компилятор ругается на синтаксис - C++
cout &lt;&lt; &quot;Введите значение длины в заданных единицах: m, cm, ft, in: &quot; &lt;&lt; '\n'; for (i=0;i&lt;100;++i){ cin &gt;&gt; length &gt;&gt; len_unit; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
01.03.2012, 14:55
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru