Вместо scanf("%c", &read)
вы можете рассмотреть read = getc(stdin)
.
Обратите внимание, что getc()
/ fgetc()
возврат int
.
Это позволяет сохранить любой символ в виде числа в диапазоне [0, 255], а также вернуть EOF
(обычно -1) в случае сбоя.
Итак, с getc()
это будет выглядеть так:
int read;
while ((read = getc(stdin)) != EOF)
Примечание:
Вы можете присвоить read
переменной типа char
& ndash; это будет неявно преобразовано. В случае успешного выполнения getc()
при неявном преобразовании не должно быть потери данных.
Небольшой пример, чтобы показать это на работе:
#include <stdio.h>
int main(void)
{
enum { N = 10 };
char buffer[N];
/* read characters and print if buffer ful */
int read, n = 0;
while ((read = getc(stdin)) != EOF) {
if (n == N) {
printf("%.*s", N, buffer); n = 0;
}
buffer[n++] = read;
}
/* print rest if buffer not empty */
if (n > 0) printf("%.*s", n, buffer);
/* done */
return 0;
}
Примечание:
Считанные символы хранятся в buffer
без окончания '\0'
. Это обрабатывается в printf()
соответственно форматером %.*s
, означающим строку с макс. ширина *
где ширина и строка считаются последовательными аргументами.
Демонстрация в реальном времени на ideone