Считывание массива строк с клавиатуры - C (СИ)
Формулировка задачи:
Требуется считать массив строк
Если пытаться присваивать элементу двумерного массива считавшийся символ, то считывание прекращается по нажатию энтера, а не по EOF, в чем может быть дело?
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char **strings = (char**)malloc(10*sizeof(char*));
char c = NULL;
int N = 0;
int j = 0;
while ((c = getchar()) != EOF)
{
int k = 0;
while (c != '\n')
strings[j][k++] = c;
j++;
}
return 0;
}Решение задачи: «Считывание массива строк с клавиатуры»
textual
Листинг программы
#include <glib.h>
#include <stdio.h>
#include <string.h>
#define STD_STR_LEN (512)
typedef struct _StringList {
GSList * pointers;
GStringChunk * data;
} StringList;
StringList * sl_new(void) {
StringList * sl = g_new(StringList, 1);
sl->pointers = NULL;
sl->data = g_string_chunk_new(STD_STR_LEN);
return sl;
}
void sl_add(StringList * list, const gchar * str) {
list->pointers = g_slist_append(list->pointers, g_string_chunk_insert(list->data, str));
}
void sl_dump(StringList * list) {
void dump(gpointer str, gpointer dummy) {
printf("%s\n", (char*)str);
}
g_slist_foreach(list->pointers, dump, NULL);
}
void sl_free(StringList * list) {
g_string_chunk_free(list->data);
g_slist_free(list->pointers);
g_free(list);
}
char * str_chomp(char * str) {
char * nl = strrchr(str, '\n');
if ( nl )
*nl = '\0';
return str;
}
int main(void) {
char str[STD_STR_LEN];
StringList * list = sl_new();
while ( printf("> ") && fgets(str, STD_STR_LEN, stdin) && *str != '\n' )
sl_add(list, str_chomp(str));
printf("\nYou has entered:\n");
sl_dump(list);
sl_free(list);
return 0;
}
Объяснение кода листинга программы
В этом коде представлена простая программа на языке C, которая позволяет пользователю вводить строки с клавиатуры и выводит их на экран. Список переменных и их значения:
list- указатель на структуруStringList, которая содержит указатель на список строк (pointers) и массив строк (data).str- строка, в которую считывается ввод пользователя.STD_STR_LEN- константа, определяющая максимальную длину строки.nl- указатель на символ новой строки (\n) в строкеstr. Программа работает в цикле, пока пользователь вводит строки и нажимает Enter. Введенные строки добавляются в списокlistс помощью функцииsl_add. Когда ввод завершается, программа выводит все строки из списка на экран с помощью функцииsl_dump. Затем список освобождается с помощью функцииsl_free, и программа завершается. Строки, вводимые пользователем, удаляются с помощью функцииstr_chompот символа новой строки в конце, чтобы они не появлялись в списке. Функцииsl_new,sl_add,sl_dump,sl_freeиstr_chompопределены в теле программы и необходимы для работы списков строк.