#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;'正如我所料
任何人都可以帮助这个计划吗?
对不起,如果有任何语法或短语错误。
答案 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
。
这样就不会有缓冲,你不必担心任何缓冲的换行符。控制台上的输出看起来很有趣(我已经输入a
和b
),除非您还通过策略性回车(\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
之间的空格这就是诀窍。