2
#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' 继续程序。但即使没有输入第二个关键字,编译器也会将输出打印为

输入您的第二个关键字

正如我预期的那样,它比'->'大'$'

任何人都可以帮助这个程序吗?

如有任何语法或短语错误,请见谅。

4

3 回答 3

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)

于 2013-08-06T07:20:15.690 回答
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 终端上,您可以将终端设置为原始模式,这将删除终端为您提供的任何缓冲区和解析能力。为此,请/bin/stty raw在终端中运行。

这样就没有缓冲,您不必担心任何缓冲的换行符。控制台上的输出看起来很有趣(我在这里输入了ab),除非您还通过策略性地放置回车符(\r)来调节它:

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

我在上面使用了你的原始代码。

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

于 2013-08-06T07:20:00.980 回答
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之间的空格

这可以解决问题。

于 2013-08-07T10:38:57.753 回答