Считывание строки с клавиатуры посимвольно и последующий вывод - C (СИ)
Формулировка задачи:
Необходимо считать строку посимвольно, до тех пор пока не будет введен пробел. Проблема в том, что когда вывожу массив символов, который хранит строку выводятся символы "Н" в количестве на единицу больше, чем было введено в массив. Что в моем коде не так? В Си я совсем начинающий.
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
void main()
{
unsigned short int n = 0; //длина строки
char *str; //строка
char s; //текущий символ
unsigned short int i;
setlocale(LC_ALL, "RUS");
puts("Введите строку посимвольно. Пробел - конец ввода.");
do
{
s = getchar();
if (s != 32)
{
n++;
str = (char*)malloc(sizeof(char)*n);
*(str+n-1) = s;
}
} while (s != 32);
for (i = 0; i < n; i++)
{
putchar(*(str + i));
}
getchar(); getchar();
}Решение задачи: «Считывание строки с клавиатуры посимвольно и последующий вывод»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
int main()
{
unsigned short int n = 0; //длина строки
char *str; //строка
char s; //текущий символ
setlocale(LC_ALL, "RUS");
str=(char*)malloc(sizeof(char));
puts("Введите строку посимвольно. Пробел - конец ввода.");
do
{
s = (char)getchar();
if (s != 32)
{
n++;
str=(char*)realloc(str,sizeof(char)*n);
*(str+n-1) = s;
}
} while (s != ' ');
str[n]=0;
puts(str);
system("pause");
return 0;
}
Объяснение кода листинга программы
- Подключение необходимых библиотек для работы с файлами и вводом-выводом.
- Установка локали на русскую.
- Выделение памяти под строку, длина которой равна 1 символу.
- Ввод строки посимвольно с помощью функции getchar(). Пробел не учитывается вводом, так как он является разделителем.
- Увеличение длины строки при каждом новом символе, выделение под него памяти с помощью функции realloc().
- Запись каждого нового символа в строку.
- Вывод строки после ввода.
- Блокировка программы до нажатия любой клавиши.
- Возвращение 0, что означает успешный конец работы программы.