2017-01-26 5 views
0

Я знаю, что есть много вопросов по той же теме scanf, пока не достигнуто EOF, но вот конкретный случай, который я не видел. Предположим, что я хочу создать программу на языке C, где пользователь вводит один символ, а программа печатает символ и количество раз, когда пользователь вводил символ, пока они не нажимают CTRL + D (EOF)C: Сканирование Пока не EOF Loop Неожиданные результаты

Это то, что У меня есть:

Однако выход не так, как ожидалось. Это следующее:

f 
time:0, char:f 
time:1, char: 

p 
time:2, char:p 
time:3, char: 

m 
time:4, char:m 
time:5, char: 

Я не слишком уверен, почему i инкрементируется снова, и почему printf получает выполняется снова. Возможно, я что-то упустил.

+4

«пользователь вводит один символ» -> Пользователь также нажал клавишу ? Попробуйте 'printf (« time:% d, char:% d \ n », i, thing);' (c-d) – chux

ответ

0

Попробуйте

#include <stdio.h> 

int main(){ 
    char thing; 
    int i=0; 
    while(scanf("%c", &thing) != EOF){ 
    if (thing!='\n') { 
     printf("time:%d, char:%c\n",i,thing); 
     i++; 
    } 
    } 

    return 0; 
} 
+0

Почему на самом деле 'if' внутри цикла ...? не помещал бы условие в условие «while» более читаемым и кратким? (т. е. 'scanf ("% c ", & thing)! = EOF && thing! = '\ n'') ... – Myst

+0

@Myst Я думаю, что OP хочет только выйти из цикла while на ctrl-D. – ccpgh

+0

Хороший вопрос ... Вероятно, вы правы, я плохой читатель, я думал, что OP пытается прочесть строку. Должна быть более глубокая: -p – Myst

0

@ user2965071

char ch; 
scanf("%c",&ch); 

С такой сниппет один читает любой ASCII-символ из потока, включающего в новой строки, возврата, вкладки или уйти. Таким образом, внутри цикла я проверил бы символ, считанный с одной из функций ctype.

Что-то вроде этого:

#include <stdio.h> 
#include <ctype.h> 

int main(){ 
    char thing; 
    int i=0; 
    while(1 == scanf("%c", &thing)){ 
    if (isalnum(thing)) { 
     printf("time:%d, char:%c\n",i,thing); 
     i++; 
    } 
    } 

    return 0; 
} 

Что касается меня, я думаю, что это не очень хорошая идея, чтобы проверить зсапЕ для возврата EOF. Я бы предпочел проверить количество хороших аргументов чтения.