我的问题是,我不确定字符比较在这个特定代码中是如何工作的:
while (1) {
scanf("%c", &c);
if (c == 'c')
printf("working\n");
else {
printf("Not working\n");
break;
}
printf("not-not-working\n");
}
我很感兴趣为什么这个程序的输出是:
我的问题是,我可以比较这样的字符,还是必须使用strcmp()
?
此break
如何运作?
PS:我已经搜索了其他答案和教程,但有点卡在我自己的问题上。
答案 0 :(得分:3)
原因是只要输入缓冲区中有字符,scanf就会返回。在按Enter键之前不会刷新缓冲区。
所以你的循环运行直到缓冲区为空,或者你点击了break语句。
将您的代码更改为:
int main (int argc, char * argv[])
{
char c[BUFSIZ];
while(1){
scanf("%c",c);
fprintf(stderr,"Input was: '%c'\n",c[0]);
if(c[0] == 'c')
printf("working\n");
else
{
printf("Not working\n");
break; // This will exit the while loop if the character is not 'c'
}
printf("not-not-working\n"); // This will always print on every iteration
}
return 0;
}
输入“c”+ [ENTER]:
时输出c
Input was: 'c'
working
not-not-working
Input was: '
'
Not working
您可以使用sscanf而不是scanf修复此示例,然后只检查第一个字符c [0]。
答案 1 :(得分:1)
直接回答您的问题:
我可以将字符与
==
进行比较吗?
是
break
如何运作?
break
循环中的while
将导致循环立即退出。
答案 2 :(得分:0)
您正在使用scanf阅读角色。当您按'c'时,您也按enter键以接受您的输入。现在缓冲区中有2个字符。
在第一次迭代时,c的值为'c',它打印'working'然后从if块出来并打印'not-not-working'。在第二次迭代时,c的值是'\ n',它不等于'c',因此它转到else块并打印'Not working'。然后break退出while循环。
为了证明这一点,当scanf读取c时,请尝试按'cccccccccccc',你会看到它将打印'工作','不工作'几倍于'c'的出现次数。
编辑:
注意,按住c直到你有足够的c,中间没有空格,然后按回车键。
答案 3 :(得分:0)
scanf("%c", &c)
正在c
和<Enter>
中扫描两个不同的字符。
键盘I / O通常是缓冲的。因此scanf()
在c
和<Enter>
被按下之前看不到任何内容。 scanf()
在第一次传递时阅读c
,在第二次传递时阅读<Enter>
(又名\n
)。更改为scanf(" %c", &c)
将首先扫描并丢弃任何前导空格,包括\n
。
更改
scanf("%c", &c);
到
char c;
scanf(" %c", &c);
c
是char
。 <{1}}没有必要。
问:这也是如何破坏的?
答:退出当前的strcmp()
循环或for/while/do
语句,然后继续下一个语句。
答案 4 :(得分:0)
你的两个问题已由上面的人回答了。我想说的是功能&#34; scanf&#34;,你应该小心,完全学习〜可能在你感兴趣的代码之下:
while(1)
{
scanf("%d",&a); //d is int type
printf("%c",c);
}
当你输入一个字符时,你能解释一下输出的原因吗?