Ввести строку и записать в массив - C (СИ)
Формулировка задачи:
как введёную пользователем строку записать в массив. если размер строки известен это понятно как делать. но если размер троки не известен заранее то и размер массива нельзя определить. Вопрос: как в си сделать чтобы вводилась строка, определялся её размер и под этот размер объявлялся массив и в него записалась строка?
Решение задачи: «Ввести строку и записать в массив»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#define DEFAULT_STRING_LENGTH (32)
char * get_string(FILE * inputStream) {
char * buf, * tmp;
unsigned currentSize, charactersCount;
int chr;
if ( ! ( buf = malloc(DEFAULT_STRING_LENGTH) ) )
return NULL;
currentSize = DEFAULT_STRING_LENGTH;
charactersCount = 0;
while ( ( chr = fgetc(inputStream) ) != EOF && chr != '\n' ) {
if ( charactersCount >= currentSize - 1 ) {
if ( ! ( tmp = realloc(buf, currentSize + DEFAULT_STRING_LENGTH) ) ) {
free(buf);
return NULL;
}
buf = tmp;
currentSize += DEFAULT_STRING_LENGTH;
}
buf[charactersCount++] = (char)chr;
}
buf[charactersCount++] = '\0';
return realloc(buf, charactersCount);
}
int main(void) {
char * s;
while ( printf("String: ") ) {
if ( ! ( s = get_string(stdin) ) ) {
fprintf(stderr, "Memory error!\n");
return 1;
}
if ( *s == '\0' ) {
free(s);
break;
}
printf("You has entered: %s\n", s);
free(s);
}
return 0;
}
Объяснение кода листинга программы
В данном коде происходит считывание строки из файла или стандартного ввода (stdin). Вводную строку сохраняют в массиве, выделяют под неё память динамически с запасом, увеличивая размер при необходимости. Код считывает символы строки, включая символ новой строки (\n), если он присутствует. Если память под строку выделяется некорректно, то выводится сообщение об ошибке и программа завершается. Возможные шаги для объяснения кода:
- Подключение необходимых библиотек
- Определение константы длины строки по умолчанию
- Функция для считывания строки из файла или стандартного ввода
- Выделение памяти под строку с запасом
- Индикатор размера текущей строки
- Считывание символов строки до символа новой строки или конца файла
- Реализация динамического увеличения памяти под строку при необходимости
- Возвращение считанной строки, выделение под неё памяти
- Основной цикл программы, в котором считанная строка выводится на экран
- Окончание программы при достижении определённого условия