2013-09-27 44 views
4
#include <stdio.h> 
int main(void) 

{ 
    char F,C; 

    printf("Do you have a Fever? y/n\n"); 
    F = getchar(); 

    printf("Do you have a runny nose or cough? y/n\n"); 
    C = getchar(); 


    printf("Here are the results you input:\n"); 
    printf("Do you have a fever?"); 
    putchar(F); 

    printf("\nDo you have a runny nose or cough?"); 
    putchar(C); 

    return 0; 
} 

该代码输入第一个getchar();的结果,然后退出而无需等待更多输入。这是为什么?无法弄清楚如何使用getchar(); in C

+3

'getchar()'返回一个'int',而不是'char'。阅读它的文档('man getchar'或相当的文档)来查看原因。 –

+3

欢迎来到Stack Overflow!不像其他一些互联网论坛,你可能知道,堆栈溢出不是一个讨论网站,也不是作业帮助网站。这是一个**问题**和 - **答案**网站。诸如你自己的用户提出问题并且其他用户试图回答他们。你的问题是什么? –

回答

5

使用while循环

printf("Do you have a Fever? y/n\n"); 
F = getchar(); 
while((F = getchar()) != EOF && F != '\n') // This will eat up all other characters 
    ; 

printf("Do you have a runny nose or cough? y/n\n"); 
C = getchar(); 
while((C = getchar()) != EOF && C != '\n') 
    ; 
+0

如果用户输入空行,该怎么办?或者更糟糕的是,键入ctrl-D或ctrl-Z或任何关键字用于EOF。 –

+0

请注意,您将在使用F和C之后放置while循环,否则它们将被重新分配给循环中消耗的其他字符。 (我知道这对你的专家来说显而易见,但是像我这样为n00bs添加了说明。) – user124384

+0

在'while'循环中使用除'C'或'F'之外的变量。并且,最好将这些环路分解为一个函数。 –

7

首先,getchar()返回int,而不是char。这是因为它可以返回任何有效的字符(对于CHAR_BIT为8的系统,值为0..255)和单独的值(通常为-1)作为EOF。

二,当用户键入答案时,信息包含字符(Y或N,你希望)加上一个换行符。有可能是领先的空白;可能会有尾随垃圾。

所以,你的F可能会得到第一个字符; C读取换行符,而不是等待更多输入。

如果你想读线并依次处理每个使用fgets()读取线和sscanf()解析结果。或者使用一个函数来封装类似的处理,如下面的get_answer()函数。

#include <stdio.h> 

int get_answer(void) 
{ 
    int c; 
    int answer = 0; 
    while ((c = getchar()) != EOF && c != '\n') 
    { 
     if (answer == 0 && (c == 'y' || c == 'n')) // Upper-case? 
      answer = c; 
     /* ?check for garbage here and complain? */ 
    } 
    return answer; 
} 

int main(void) 
{ 
    int F,C; 
    char line[4096]; 

    printf("Do you have a Fever? y/n\n"); 
    F = get_answer(); 

    printf("Do you have a runny nose or cough? y/n\n"); 
    C = get_answer(); 


    printf("Here are the results you input:\n"); 
    printf("Do you have a fever? %c\n", F); 
    printf("Do you have a runny nose or cough? %c\n", C); 

    return 0; 
} 

请注意,换行符通常在输出结束时结束。您可以从提示消息中忽略它们,以便输入与交互式会话中的提示出现在同一行。 调用代码并未真正处理EOF - 在输入任何数据之前,这些使用会触发EOF条件(例如,通过输入Control-D)。 get_answer()中的代码是可以的; main()中的代码应测试零回报。如果你想只处理一个字符,每getchar()

1

这是因为当你按下Enter键,回答第一个问题后,回车键被保存到下一个变量C. 要纠正它,只需编写另一个getchar来消化额外的Enter。

它应该是: -

#include <stdio.h> 
int main(void) 

{ 
char F,C; 

printf("Do you have a Fever? y/n\n"); 
F = getchar(); 

getchar(); /* takes the enter key */ 

printf("Do you have a runny nose or cough? y/n\n"); 
C = getchar(); 

getchar(); /* takes the enter key */ 

printf("Here are the results you input:\n"); 
printf("Do you have a fever?"); 
putchar(F); 

printf("\nDo you have a runny nose or cough?"); 
putchar(C); 

return 0; 
} 
0

当你输入一个字符,它被保存在F,则当你按下回车键,存储在标准输入缓冲区,接下来的getchar()来读取它的从标准输入缓冲区输入,为此在每次使用getchar()之前使用fflush(stdin)。