C: сбор пользовательского ввода с помощью цикла while и сохранение в массиве

#c

#c

Вопрос:

У меня есть этот проект кодирования, над которым я застрял уже некоторое время. Я не очень хорошо знаком с кодированием на C, больше с Java.

Вот мой код:

 char *array[20];
int linecount = 0;
bool c = true;

array[0] = (char*)malloc(96 *sizeof(char));
// array[0] = "temp";
while(c){
    array[linecount] = (char*)malloc(96 *sizeof(char)); 
    printf("Enter a string: ");
    fgets(array[linecount], sizeof(array[linecount]), stdin);
    if(strcmp(array[linecount], "") == 10) c = false;
    linecount  ;
}
for(int i = 0; i < linecount; i  ){
    printf("%d %s",i, array[i]);
}
printf("Done");
  

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

Итак, я создал массив указателей с фиксированной длиной 20 только для начала и цикла while. Но когда я запускаю программу, она работает так, как я хочу. Когда я ввожу любые пробелы во входных данных, он печатает «Введите строку:» несколько раз.

Комментарии:

1. fgets сохраняет n в конце строки, поэтому strcmp(array[linecount], "") == 10 бессмысленно, а сравнение с 10 еще более бессмысленно. Также sizeof(array[linecount]) это не то, что вы думаете. Вы хотите 96 вместо этого. Скорее всего, проблем больше.

2. Спасибо, похоже, это сработало, когда я изменил его на 96. Также почему strcmp(array[linecount], «») == 10 бессмысленно? Я пытаюсь проверить, является ли строка пустой, и я нашел другие сообщения, в которых говорится об использовании strcmp. Когда я печатаю его, сравнивая его с пустой строкой, я получаю 10, поэтому я решил сравнить его с 10.

3. Объясните, что strcmp(array[linecount], "") == 10 предполагается делать? Что такое магическое число 10?

4. sizeof(array[linecount]) это размер самого указателя (4 или 8 байт, в зависимости от платформы). Это не размер буфера памяти, на который ссылается. При использовании динамического выделения памяти (например malloc ) вы должны сами запомнить размер буфера. Вы не можете просто использовать sizeof для его определения.

5. Проверьте возвращаемое значение fgets. Возможно, он вернул -1 и ничего не записал в буфер.