C: как заполнить таблицу с помощью fgets (), если мы не знаем длину? - PullRequest
0 голосов
/ 21 декабря 2018

Я пытаюсь заполнить таблицу слово за словом методом fgets ().Мне нужно заполнить таблицу словами (максимум 25), которые пользователь пишет шаг за шагом.Проблема в том, что на моем терминале, если я делаю для примера:

  • ab (затем нажмите Enter)
  • ac (затем нажмите Enter)
  • ad (затем нажмитеEnter)
  • tu (затем нажмите Enter)
  • (затем нажмите Ctrl + D для остановки)

Вывод:

  • tu
  • tu
  • tu
  • tu

Так что в основном это просто копирование последнего слова для каждого введенного мной ввода

Я пытался заменить "tab [length] = line;"с помощью "strcpy (tab [length], line);"но когда я делаю это, у меня появляется «Ошибка сегментации (ядро сброшено)»

#define NBRE_CHAR 256

int main(int argc, char const *argv[])
{   
    char* tab[25];
    int length =0;
    char line[NBRE_CHAR];
    while(fgets(line,NBRE_CHAR,stdin) != NULL){
        line[strlen(line)-1] = '\0'; // to delete \n
        tab[length] = line;
        length++;
    }
    for (int i = 0; i < length; i++)
    {
        printf("%s\n", tab[i] );
    }
}

1 Ответ

0 голосов
/ 21 декабря 2018

char* tab[25]; - это массив из 25 указателей на символы (строки).

С tab[length] = line; вы назначаете буфер line массиву.Но это не копирует строку.В результате все записи указывают на ваш однострочный буфер, в котором будет ваша последняя введенная строка.

То, что вы можете захотеть:

    char* tab[25];
    //...
        tab[length]= malloc(strlen(line)+1);
        strcpy(tab[length], line);

Это выделяет память для каждой строки, а затемкопирует содержимое вашего буфера в эту память.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...