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来解决他的问题,这有点尴尬。请随意改进示例。