2013-12-13 46 views
1

我在这里的问题是,我真的不知道字符比较在这个特定的代码是如何工作的:字符比较,并打破

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:我搜索了其他的答案和教程,但有点卡住了我自己的问题。

+0

由于'not-not-working'超出了'if'的范围,因此它总是显示出来。在第一个“if”之后放一个'break'。 PS:'return 0'也可以。 – Tico

+0

为了更好地了解代码中发生了什么,您可能需要打印'c'以及'scanf'的返回值。 – danfuzz

+0

是的,可以说它已经初始化了。 – Michael

回答

1

直接回答你的问题:

我可以比较字符==

是。

break如何工作?

A breakwhile循环中将导致循环立即退出。

3

原因是只要输入缓冲区中有字符,scanf就会返回。在按回车键之前,缓冲区不会被刷新。

因此,您的循环会一直运行,直到缓冲区为空,或者您按下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]。

+0

是的,这有帮助。我现在知道了。谢谢 – Michael

+0

干得不错;我同意问题中的报告输出与程序应该生成的输出不匹配 - 并且您已经保存了我不得不编译代码以显示该输出。也很好地回应输入;这是一种用于调试代码的非常强大的技术 - 它告诉你程序实际上看到的是什么,而不是你认为应该看到的内容。不同的(这里是换行符)对于理解程序通常是至关重要的。 –

+0

谢谢。 我想这里的诀窍是使用sscanf,并只检查第一个字符。我不太喜欢用这种方式来实现命令行界面,并且通常更喜欢使用gengetopt来处理所有事情。 [GenGetOpt](http://www.gnu.org/software/gengetopt/gengetopt.html) – Trygve

0

您正在使用scanf阅读角色。当您按'c'时,您还可以按enter键以接受您的输入。现在你在缓冲区中有2个字符。

在第一次迭代中,c的值是'c',它打印'working',然后从if区块出来并打印'not-not-working'。在第二次迭代中,c的值是'\ n',它不等于'c',因此它会转到else块并打印'Not working'。然后中断退出while循环。

为了证明这一点,请尝试按下'ccccccccccc',当scanf读取c时,您会看到它会打印'working','not-not-working'几次,出现的次数为'c'。

编辑:

注意,按住c,直到你有足够的C没有空间,然后按之间进入。

0

scanf("%c", &c)正在扫描c<Enter>作为2个独立的字符。

键盘I/O通常被缓冲。所以scanf()只看到c<Enter>被按下。 scanf()阅读第一遍c<Enter>(又名\n)。更改为scanf(" %c", &c)将首先扫描并丢弃任何前导空白,包括\n

变化

scanf("%c", &c); 

char c; 
scanf(" %c", &c); 

问:我可以比较性格就是这样,还是我用的strcmp()?
- 答:是的,你可以比较为发布是c是一个charstrcmp()是没有必要的。

问:这个休息是如何工作的?
答:退出当前的for/while/do循环或switch声明并继续下一个声明。

0

你的两个问题已经受到人们的回答above.what我想说的是功能“scanf函数”,你应该小心的是,李尔它完全〜也许下面的代码你会感兴趣:

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

时你输入一个字符,你能解释为什么输出吗?