Ввести строку и записать в массив - 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), если он присутствует. Если память под строку выделяется некорректно, то выводится сообщение об ошибке и программа завершается. Возможные шаги для объяснения кода:
- Подключение необходимых библиотек
- Определение константы длины строки по умолчанию
- Функция для считывания строки из файла или стандартного ввода
- Выделение памяти под строку с запасом
- Индикатор размера текущей строки
- Считывание символов строки до символа новой строки или конца файла
- Реализация динамического увеличения памяти под строку при необходимости
- Возвращение считанной строки, выделение под неё памяти
- Основной цикл программы, в котором считанная строка выводится на экран
- Окончание программы при достижении определённого условия
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д