В
char a;
...
while (scanf("%s[^\n]",&a) == 1)
Ваш формат недопустим, поскольку выделен для строки, а вы хотите читать только символ, поэтому вы будете писать из него, по крайней мере, для завершающего нулевого символа, что приведет к неопределенному поведению
сделать
char a;
...
while (scanf(" %c",&a) == 1)
и обратите внимание на пробел в формате, удалите его, если хотите управлять всеми символами
В
if (a >= 65 && a <= 90)
неправильно использовать код ASCII, он не читается и не совместим с не ASCII
вы можете сделать
if (a >= 'A' && a <= 'Z')
или лучше использовать isupper (<ctype.h>
), потому что он не гарантирует, что заглавные буквы являются последовательными
Ваш printf может быть заменен на , помещает , удаляя \ n в строке, или fputs , бесполезно иметь printf для печати простой строки (без% и arg)
Но почему это не вечный цикл и существует после чтения файла?
scanf не возвращает 1 в EOF, поэтому цикл останавливается в EOF, около scanf family:
Эти функции возвращают количество элементов ввода, успешно сопоставленных и назначенных, которое может быть меньше предусмотренного или даже равно нулю в случае сбоя раннего сопоставления.
Значение EOF возвращается, если достигнут конец ввода перед первым успешным преобразованием или ошибкой сопоставления. EOF также возвращается, если возникает ошибка чтения, и в этом случае устанавливается индикатор ошибки для потока (см. Ferror (3)), и устанавливается errno, обозначающий ошибку.