我有一个像这样的非常简单的程序
int main()
{
int opt;
int n;
int flag = 1;
while(flag)
{
printf("m inside while.Press c to continue\n");
if((opt = getchar())== 'c')
{
printf("choose a number\n");
scanf(" %d",&n);
switch(n)
{
case 0:
printf("m zero\n");
break;
case 1:
printf("entered one\n");
break;
case 3:
printf("m exit\n");
flag = 0;
break;
}
printf("m broke\n");
}
}
printf("m out\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我得到这样的输出:
m inside while.Press c to continue
c
choose a number
1
entered one
m broke
m inside while.Press c to continue
m inside while.Press c to continue
c
choose a number
Run Code Online (Sandbox Code Playgroud)
我的疑问是为什么“m inside while.Press c to continue”在每次循环后都会打印两次?
提前致谢
这是因为\n前任留下的性格scanf。当您输入一个数字并按下Enter键时,一个额外的\n字符会被传递到标准输入缓冲区。scanf读取留\n在缓冲区中的那个 nuber 。在您按下任何字符之前,在循环的下一次迭代中getchar读取\n,因此m inside while.Press c to continue打印两次\nis not c。
将此代码片段scanf放在while循环中的语句之后以吃掉换行符
while(getchar() != '\n');
Run Code Online (Sandbox Code Playgroud)
这会吃掉任意数量的\n.
有关getchar阅读此答案的行为的更详细说明。
你最终的代码应该是
int main()
{
int opt;
int n;
int flag = 1;
while(flag)
{
printf("m inside while.Press c to continue\n");
if((opt = getchar())== 'c')
{
printf("choose a number\n");
scanf(" %d",&n);
while(getchar() != '\n');
switch(n)
{
case 0:
printf("m zero\n");
break;
case 1:
printf("entered one\n");
break;
case 3:
printf("m exit\n");
flag = 0;
break;
}
printf("m broke\n");
}
}
printf("m out\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
while(flag)
{
printf("m inside while.Press c to continue\n");
while((opt=getchar()) != '\n') {
if(opt == 'c')
{
printf("choose a number\n");
scanf(" %d",&n);
switch(n)
{
case 0:
printf("m zero\n");
break;
case 1:
printf("entered one\n");
break;
case 3:
printf("m exit\n");
flag = 0;
break;
}
printf("m broke\n");
}
}
}
Run Code Online (Sandbox Code Playgroud)