Как прочитать несколько строк в C по одной в строке, каждая из которых содержит пробелы? - PullRequest
0 голосов
/ 21 января 2020

Я выделил двумерный массив символов, и при чтении строк без пробелов код работает нормально. Когда я читаю их с пробелами, я сталкиваюсь с ошибкой. Как прочитать все N строк, каждая в одной строке, каждая из которых содержит пробелы.

Пример ввода:

Enter total number of Strings : 3

Enter all the 3 Strings :

John Doe

Jane Doe

Trad Braversy

Мой код:

// Code to enter the total number of Strings : 
int N;
printf("\n\tEnter the total number of Strings : ");
scanf("%d", &N);

// Code for allocating initial memory to them :
char** strings = (char**)malloc(N * sizeof(char*));
for (int i = 0; i < N; ++i) {
    strings[i] = (char*)malloc(1024 * sizeof(char));
}

// Code for entering all the N strings :
printf("\n\tEnter all the %d Strings :\n", N);
for (int i = 0; i < N; ++i) {
    gets(strings[i]);
}

// Code to reallocate the memory according to the entered length :
for (int i = 0; i < N; ++i) {
    strings[i] = (char*)realloc(strings[i], strlen(strings[i]) + 1);
}

1 Ответ

3 голосов
/ 21 января 2020

Несколько замечаний:

Безопаснее прочитать полную строку текста, а затем проанализировать целое число, а не делать scanf() для одного целого числа. Это связано с тем, что последний оставляет новую строку в потоке, что может сбить с толку последующие операции чтения.

Нет смысла использовать malloc() для динамического выделения памяти c, для этого вы можете использовать VLA:

char strings[N][1024];

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

Тогда намного лучше использовать fgets(), это безопаснее и просто лучше:

for (int i = 0; i < N; ++i)
{
  if (fgets(strings[i], sizeof strings[i], stdin) == NULL)
  {
    fprintf(stderr, "**Read error on string %d\n", i);
    exit(1);
  }
}

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

...