Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c和break中的字符比较_C - Fatal编程技术网

c和break中的字符比较

c和break中的字符比较,c,C,我的问题是,我不确定字符比较在这个特定代码中是如何工作的: while (1) { scanf("%c", &c); if (c == 'c') printf("working\n"); else { printf("Not working\n"); break; } printf("not-not-working\n"); } 我感兴趣的是为什么这个程序的输出是: 如果我输入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? 这个休息时间是怎么工作的


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

直接回答您的问题:

我可以将字符与==进行比较吗

休息是怎么工作的


中断while循环将导致循环立即退出。

直接回答您的问题:

我可以将字符与==进行比较吗

休息是怎么工作的


while循环中的中断将导致循环立即退出。

原因是只要输入缓冲区中有字符,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]。

原因是只要输入缓冲区中有字符,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]。

您正在使用scanf读取一个字符。当您按“c”时,您还可以按enter键让scanf接受您的输入。现在缓冲区中有2个字符

在第一次迭代中,c的值为“c”,它打印“工作”,然后从if块中出来,打印“不工作”。在第二次迭代中,c的值为'\n',它不等于'c',因此它转到else块并打印'not working'。然后break退出while循环

要证明这一点,请在scanf读取c时按“CCCC”,您将看到它将打印“正在工作”、“未工作”的次数是“c”出现次数的几倍

编辑:


注意,按住c键,直到有足够的c键且中间没有空格,然后按enter键。

您正在使用scanf读取字符。当您按“c”时,您还可以按enter键让scanf接受您的输入。现在缓冲区中有2个字符

在第一次迭代中,c的值为“c”,它打印“工作”,然后从if块中出来,打印“不工作”。在第二次迭代中,c的值为'\n',它不等于'c',因此它转到else块并打印'not working'。然后break退出while循环

要证明这一点,请在scanf读取c时按“CCCC”,您将看到它将打印“正在工作”、“未工作”的次数是“c”出现次数的几倍

编辑:

请注意,按住c键,直到有足够的c且中间没有空格,然后按enter键。

scanf%c,&c将以c和两个单独的字符进行扫描

键盘I/O通常是缓冲的。所以在按下c和之前,scanf什么也看不见。scanf在第一遍读取c,在第二遍读取aka\n。更改为scanf%c,&c将首先扫描并放弃任何前导空格,包括\n

改变

scanf("%c", &c);

问:我可以比较像这样的角色,还是我必须使用strcmp? A:是的,你可以比较,因为c是字符。strcmp不是必需的

问:这段休息时间是如何工作的? A:退出当前的for/while/do循环或switch语句,然后继续下一个语句。

scanf%c,&c正在以c和两个单独的字符进行扫描

键盘I/O通常是缓冲的。所以在按下c和之前,scanf什么也看不见。scanf在第一遍读取c,在第二遍读取aka\n。更改为scanf%c,&c将首先扫描并放弃任何前导空格,包括\n

改变

scanf("%c", &c);

问:我可以比较像这样的角色,还是我必须使用strcmp? A:是的,你可以比较,因为c是字符。strcmp不是必需的

问:这段休息时间是如何工作的?
答:退出当前的for/while/do循环或switch语句,然后继续下一个语句。

您的两个问题已由上面的人回答。我想说的是函数scanf,您应该小心,完全了解它~可能您会感兴趣的代码如下:

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

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

你的两个问题已经被上面的人回答了。我想说的是函数scanf,你应该小心,完全了解它~也许下面的代码你会感兴趣:

while(1)
{
   scanf("%d",&a);     //d is int type
   printf("%c",c);
}
当你输入一个字符时,你能
u解释为什么输出?

因为“不工作”超出了“如果它总是出现”的范围。休息一下;在第一个if之后。PS:返回0也可以。您可能希望打印c以及scanf的返回值,以便更好地查看代码中发生的情况。是的,假设它已初始化。请注意,声明的输出与程序实际生成的不匹配。最好检查scanf是否工作正常;您不知道它何时获得EOF,因为您没有检查它的返回值。您每次都需要检查输入函数的返回值—如果您不检查,则有时会出现严重错误。因为“不工作”是不可能的,因为它总是会出现。休息一下;在第一个if之后。PS:返回0也可以。您可能希望打印c以及scanf的返回值,以便更好地查看代码中发生的情况。是的,假设它已初始化。请注意,声明的输出与程序实际生成的不匹配。最好检查scanf是否工作正常;您不知道它何时获得EOF,因为您没有检查它的返回值。你每次都需要检查输入函数的返回值——如果不检查,有时会出现严重错误;我同意问题中报告的输出与程序应该生成的输出不匹配,而您已经让我不用编译代码来显示这一点。输入的回声也很好;这是调试代码的一种非常强大的技术——它告诉您程序实际看到了什么,而不是您认为它应该看到什么。这里的不同之处在于,新词对理解节目通常至关重要。谢谢。我想这里的诀窍是使用sscanf,只需检查第一个字符。我不太习惯用这种方式实现命令行界面,通常更喜欢用gengetopt实现所有功能。这在fprintfstderr中有未定义的行为,输入为:“%s”\n,c;。c[BUFSIZ]未初始化,因此当将c打印为字符串时,不知道它是否\0终止。感谢Chux指出这一点。现在已在邮件中修复。我想用sscanf来解决他的问题,这有点尴尬。请随意改进示例。干得好;我同意问题中报告的输出与程序应该生成的输出不匹配,而您已经让我不用编译代码来显示这一点。输入的回声也很好;这是调试代码的一种非常强大的技术——它告诉您程序实际看到了什么,而不是您认为它应该看到什么。这里的不同之处在于,新词对理解节目通常至关重要。谢谢。我想这里的诀窍是使用sscanf,只需检查第一个字符。我不太习惯用这种方式实现命令行界面,通常更喜欢用gengetopt实现所有功能。这在fprintfstderr中有未定义的行为,输入为:“%s”\n,c;。c[BUFSIZ]未初始化,因此当将c打印为字符串时,不知道它是否\0终止。感谢Chux指出这一点。现在已在邮件中修复。我想用sscanf来解决他的问题,这有点尴尬。请随意改进示例。