#c #input #output #eof
#c #ввод #вывод #eof
Вопрос:
Я только изучаю c, и я использую Linux terminal. Я написал следующий простой код, но когда я набираю входные данные, файл не завершается и, следовательно, не подсчитывает количество символов. Кто-нибудь может мне с этим помочь? Я пробовал и другие коды ввода. То же самое со всеми моими кодами, связанными с вводом. Что я делаю не так? Пожалуйста, помогите.
main()
{
/* count characters in input */
printf("Type some characters and the program will count the number of characters: ");
int c = getchar();
while(c!=EOF amp;amp; c!= 'n')
c;
printf("Number of characters typed: n", c);
}
Комментарии:
1. Вы читаете только один символ, поскольку вызываете
getchar
только один раз. Вам нужно вызывать его повторно до тех пор, пока вы не столкнетесь сEOF
(илиn
или, может быть, с каким-либо другим вашим условием остановкиwhile ((c=getchar()) != EOF)
?2. Что это за функция getchar () ? Способ получения входных данных обычно осуществляется через scanf («% s», буфер), который примет входные данные и скопирует их в буфер переменной
3. @Yvain
getchar
— это стандартная функция, определенная в stdio.h; если OP хочет прочитать char по char, scanf («%s») на самом деле не подходит.4. Вы также используете ту же переменную для количества символов, что и входной символ. Как это могло бы сработать?
5. Спасибо, что указали на глупую ошибку @Barmar. Я сходил с ума от этого! В конце концов, сегодня вечер пятницы! Обновленный код: #include <stdio.h> main() { int c; printf(«Введите некоторые символы: «); while(getchar()!=EOF amp;amp; getchar()!= ‘n’) c; printf(«Общее количество введенных символов = n», c); }
Ответ №1:
Итак, обратите внимание на полезные комментарии;
#include <stdio.h>
int main(){
int c;
int count = 0;
while((c=getchar()) != 'n' amp;amp; c != EOF)
count ;
printf("%dn", count);
};
Этот код работает так, как ожидалось.
Комментарии:
1. Вы говорите,
while((c=getchar()) != 'n' || c != EOF)
следует ли использовать? Разве это не было бы бесконечным циклом, поскольку все символы, четные'n'
иEOF
, не равны ни одному из них и будут выполнять условие всегдаtrue
.2. Нет, этот цикл означает: «до тех пор, пока входной символ не является ни ‘newline’, ни ‘EOF'», если вы заменили or на и это означало бы «до тех пор, пока входной символ не является ‘newline’, объединенным с ‘EOF'», так что этот цикл действительно никогда не остановится.
3. Вы ошиблись, приятель. Допустим,
c
это'n
‘. Ваше условие будет оценено какwhile('n' != 'n' || 'n' != EOF)
===>while(false || true)
===>while(true)
. Теперь давайте посмотрим,c
так лиEOF
,while(EOF != 'n' || EOF != EOF)
===>while(true || false)
===>while(true)
. Для всего остальногоwhile(true || true)
. Когда закончится цикл? Я не могу поверить, что мне нужно вводить здесь оценку кода.