Считывание массива строк с клавиатуры - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Требуется считать массив строк Если пытаться присваивать элементу двумерного массива считавшийся символ, то считывание прекращается по нажатию энтера, а не по EOF, в чем может быть дело?
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main(void)
  4. {
  5. char **strings = (char**)malloc(10*sizeof(char*));
  6. char c = NULL;
  7. int N = 0;
  8. int j = 0;
  9. while ((c = getchar()) != EOF)
  10. {
  11. int k = 0;
  12. while (c != '\n')
  13. strings[j][k++] = c;
  14. j++;
  15. }
  16. return 0;
  17. }

Решение задачи: «Считывание массива строк с клавиатуры»

textual
Листинг программы
  1. #include <glib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5. #define STD_STR_LEN (512)
  6.  
  7. typedef struct _StringList {
  8.     GSList * pointers;
  9.     GStringChunk * data;
  10. } StringList;
  11.  
  12. StringList * sl_new(void) {
  13.     StringList * sl = g_new(StringList, 1);
  14.     sl->pointers = NULL;
  15.     sl->data = g_string_chunk_new(STD_STR_LEN);
  16.    
  17.     return sl;
  18. }
  19.  
  20. void sl_add(StringList * list, const gchar * str) {
  21.     list->pointers = g_slist_append(list->pointers, g_string_chunk_insert(list->data, str));
  22. }
  23.  
  24. void sl_dump(StringList * list) {
  25.     void dump(gpointer str, gpointer dummy) {
  26.         printf("%s\n", (char*)str);
  27.     }
  28.     g_slist_foreach(list->pointers, dump, NULL);
  29. }
  30.  
  31. void sl_free(StringList * list) {
  32.     g_string_chunk_free(list->data);
  33.     g_slist_free(list->pointers);
  34.     g_free(list);
  35. }
  36.  
  37. char * str_chomp(char * str) {
  38.     char * nl = strrchr(str, '\n');
  39.     if ( nl )
  40.         *nl = '\0';
  41.        
  42.     return str;
  43. }
  44.  
  45. int main(void) {
  46.     char str[STD_STR_LEN];
  47.     StringList * list = sl_new();
  48.    
  49.     while ( printf("> ") && fgets(str, STD_STR_LEN, stdin) && *str != '\n' )
  50.         sl_add(list, str_chomp(str));
  51.    
  52.     printf("\nYou has entered:\n");
  53.     sl_dump(list);
  54.    
  55.     sl_free(list);
  56.     return 0;
  57. }

Объяснение кода листинга программы

В этом коде представлена простая программа на языке C, которая позволяет пользователю вводить строки с клавиатуры и выводит их на экран. Список переменных и их значения:

  1. list - указатель на структуру StringList, которая содержит указатель на список строк (pointers) и массив строк (data).
  2. str - строка, в которую считывается ввод пользователя.
  3. STD_STR_LEN - константа, определяющая максимальную длину строки.
  4. nl - указатель на символ новой строки (\n) в строке str. Программа работает в цикле, пока пользователь вводит строки и нажимает Enter. Введенные строки добавляются в список list с помощью функции sl_add. Когда ввод завершается, программа выводит все строки из списка на экран с помощью функции sl_dump. Затем список освобождается с помощью функции sl_free, и программа завершается. Строки, вводимые пользователем, удаляются с помощью функции str_chomp от символа новой строки в конце, чтобы они не появлялись в списке. Функции sl_new, sl_add, sl_dump, sl_free и str_chomp определены в теле программы и необходимы для работы списков строк.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.286 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы