谁能检查程序并告诉我如何才能获得正确的输出?

时间:2013-08-06 07:11:10

标签: c compilation output getchar

#include <stdio.h>
#include <stdlib.h>

int main()

{

    char a,b;

    printf("enter the firstkeyword \n");
    a = getchar();
    printf("enter your second keyword \n");
    b = getchar();

    if(a>b)
    {
    printf("it is '%c' greater than '%c' as i expected \n",a,b);
    }
    else if (b>a)
    {
    printf("here'%c'is greater than '%c' \n",b,a);
    }
    else
    {
    printf("dont type the same character twice in next session \n");
    }
    return(0);

}

编译程序后,o / p为:

  

输入第一个关键字

我输入'$'并使用ctrl + z来eof并'enter'继续该程序。但即使没有输入第二个关键字,编译器也会将输出打印为

  

输入您的第二个关键字

     

'$'大于' - &gt;'正如我所料

任何人都可以帮助这个计划吗?

对不起,如果有任何语法或短语错误。

3 个答案:

答案 0 :(得分:5)

当你按下缓冲区中仍然存在的getchar()时,

\n也会收取额外的输入enter。你需要吸收这个额外的字符才能让第二个getchar工作。尝试拨打getchar两次,如下所示 -

char just_to_consume;
a = getchar();
just_to_consume = getchar();
printf("enter your second keyword \n");
b = getchar();
just_to_consume = getchar();

除了上述选项,你可以使用标准函数setvbuf来控制缓冲。还有一个选项(我个人不喜欢这个以避免未定义的行为)正在使用fflush(stdin)

答案 1 :(得分:2)

问题是您的换行符会被缓冲并传递到下一个getchar来电。您需要以下列方式处理缓冲的换行符:

printf("enter the firstkeyword \n");
scanf(" %c", &a);

printf("enter your second keyword \n");
scanf(" %c", &b);

%c之前的空格是一个常见的习惯用法,告诉scanf忽略下一个字符之前的任何空格,在我们的例子中也包括换行符。在这种特殊情况下,首先没有必要,但在第二种情况下则不是必需的。

您也不需要stdlib包含,return没有括号,例如return 0;

实际上,如果您想进行实验并且在Linux终端上,可以在raw mode中设置终端,这将删除终端为您提供的任何缓冲区和解析能力。为此,请在终端中运行/bin/stty raw

这样就不会有缓冲,你不必担心任何缓冲的换行符。控制台上的输出看起来很有趣(我已经输入ab),除非您还通过策略性回车(\r来规范这一点):

$ ./a.out 
         enter the firstkeyword 
                               aenter your second keyword 
                                                         bhere'b'is greater than 'a' 

我已将原始代码用于上述内容。

要恢复它,只需运行/bin/stty cooked

答案 2 :(得分:0)

C将'\ n'作为第二个字符。你可以做的是输入与

相同的字符

$ @

或者不使用getchar()函数

修改你的程序
char a,b;
printf("enter the firstkeyword \n");
scanf(" %c",&a);
printf("enter your second keyword \n");
scanf(" %c",&b);

请注意%c

之间的空格

这就是诀窍。