Как вернуть функцию ReadLine () в C? - PullRequest
0 голосов
/ 20 августа 2011

Я немного застрял здесь ... При использовании этой функции conReadLine() дважды она возвращает тот же адрес, что и вторая строка, которую я прочитал ранее. Например, если он дважды запрашивает имя, и я ввожу «NameA» и «NameB», сохраненными результатами являются «NameB» и «NameB». Я понимаю, почему это происходит, но я не могу понять, как это решить. Объявление «буфера» как статического будет делать то же самое. Как я могу заставить эту функцию возвращать отдельный адрес в каждой строке?

const char *conReadLine(void)
{   
    char buffer[MAX_BUFFER];

    fgets(buffer, MAX_BUFFER, stdin);

    // Check for newline character.
    char *newline = strchr(buffer, '\n');
    if (newline)
        *newline = '\0';  

    return buffer;
}

Ответы [ 2 ]

1 голос
/ 20 августа 2011

Делаем это:

const char *conReadLine(void)
{   
    char buffer[MAX_BUFFER];
    // something
    return buffer;
}

Возвращает указатель на освобожденный стек, что очень плохо. это также приводит к непредсказуемым результатам, которые включают повторное использование одного и того же адреса с другими вызовами и даже с другой функцией вместе!

вам нужно сделать это вместо:

const char *conReadLine(void)
{   
    char *buffer = (char*)malloc(MAX_BUFFER);
    // something
    return buffer;
}

, который каждый раз даст вам новую ячейку памяти. просто не забудьте free, когда закончите.

0 голосов
/ 20 августа 2011

Это классика!

Функция возвращает указатель на внутреннюю переменную (буфер).Таким образом, в основном ваши данные находятся в той части памяти (стеке), где последовательный вызов других функций будет перезаписывать их.

В этом случае, когда вы вызываете одну и ту же функцию дважды, положение переменных равноточно так же.Итак, память, в которую записано nameA, перезаписывается с помощью nameB и следующим вызовом.

веселее: создайте функцию

const char *intermediate(void) {
  char buffer[MAX_BUFFER];
  return conReadLine();
}

при первом вызове conReadLine ивторой промежуточный.Дополнительный вызов функции и локальная переменная «сместят» область памяти, поэтому она больше не будет перезаписывать ее!

Два решения:

1) вместо хранения данных в статической определеннойбуфер, получить некоторую память из кучи, используя malloc (не забывайте free, когда это больше не нужно).

2) после первого вызова, скопируйте содержимое буфера в другое место так,Вы можете сделать их непригодными, когда вам это нужно.

Добро пожаловать в мир указателей C!

...