c和break中的字符比较

时间:2013-12-13 01:00:35

标签: c

我的问题是,我不确定字符比较在这个特定代码中是如何工作的:

while (1) {
    scanf("%c", &c);
    if (c == 'c')
        printf("working\n");
    else {
        printf("Not working\n");
        break;
    }
    printf("not-not-working\n");
}

我很感兴趣为什么这个程序的输出是:

  • 如果我输入“c”,则输出为:工作,不工作,不工作
  • 如果我输入其他内容:不工作,不工作。

我的问题是,我可以比较这样的字符,还是必须使用strcmp()? 此break如何运作?

PS:我已经搜索了其他答案和教程,但有点卡在我自己的问题上。

5 个答案:

答案 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);

问:我可以比较这样的字符,还是必须使用strcmp()?
答:是的,您可以比较已发布的cchar。 <{1}}没有必要。

问:这也是如何破坏的? 答:退出当前的strcmp()循环或for/while/do语句,然后继续下一个语句。

答案 4 :(得分:0)

你的两个问题已由上面的人回答了。我想说的是功能&#34; scanf&#34;,你应该小心,完全学习〜可能在你感兴趣的代码之下:

while(1)
{
   scanf("%d",&a);     //d is int type
   printf("%c",c);
}

当你输入一个字符时,你能解释一下输出的原因吗?