为什么在特定行中使用 getchar?
Why use getchar in specific line?
如果第 5 行的 getchar() 没有使用,为什么下面的代码会在一轮后终止?
char s;
while(1){
printf("Enter two integers: ");
scanf("%d%d",&a,&b);
getchar();
c = a + b;
printf("Addition of %d & %d is %d\n",a,b,c);
printf("Add more numbers(yes/no): ");
scanf("%c",&s);
if(s == 'y')
continue;
else
break;
}
为什么在以下代码中使用字符串不起作用?我已经包含了 文件。
char s[10];
while(1){
printf("Enter two integers: ");
scanf("%d%d",&a,&b);
getchar();
c = a + b;
printf("Addition of %d & %d is %d\n",a,b,c);
printf("Add more numbers(yes/no): ");
scanf("%s",s);
if(s == "yes")
continue;
else
break;
}
当您输入第一个 scanf("%d%d",&a,&b)
时,您可能用 Enter 键结束了输入。
Enter 键作为换行符添加到 scanf
从中读取的输入缓冲区。
如果您没有 getchar()
调用,那么下一个 scanf("%c",&s)
将读取换行符。
如您所述,一种解决方案是使用 getchar()
读取并丢弃换行符。另一个解决方案是让 scanf
做同样的事情:
scanf(" %c",&s);
// ^
// Note the space here!
前导 space 告诉 scanf
跳过并忽略所有前导的白色-space 字符,其中换行符就是一个这样的字符。
请注意,scanf
的大多数格式说明符会自动跳过并忽略前导白色-space。例如 %s
会这样做,这意味着你的第二个版本 scanf("%s",s)
不需要 getchar()
调用。
另请注意,通过在调试器中花五分钟逐个语句单步执行代码,同时监视变量及其值,应该可以轻松推断出这一点。
然后 s == "yes"
。这里发生的是数组 s
将衰减为指向其第一个元素的指针,文字字符串也是如此,然后您比较这些指针以查看它们是否相同,而它们很可能永远不会相同。
它有点简化,等同于:
char yes_literal[4] = "yes";
if (&s[0] == &yes_literal[0]) ...
如果第 5 行的 getchar() 没有使用,为什么下面的代码会在一轮后终止?
char s;
while(1){
printf("Enter two integers: ");
scanf("%d%d",&a,&b);
getchar();
c = a + b;
printf("Addition of %d & %d is %d\n",a,b,c);
printf("Add more numbers(yes/no): ");
scanf("%c",&s);
if(s == 'y')
continue;
else
break;
}
为什么在以下代码中使用字符串不起作用?我已经包含了
char s[10];
while(1){
printf("Enter two integers: ");
scanf("%d%d",&a,&b);
getchar();
c = a + b;
printf("Addition of %d & %d is %d\n",a,b,c);
printf("Add more numbers(yes/no): ");
scanf("%s",s);
if(s == "yes")
continue;
else
break;
}
当您输入第一个 scanf("%d%d",&a,&b)
时,您可能用 Enter 键结束了输入。
Enter 键作为换行符添加到 scanf
从中读取的输入缓冲区。
如果您没有 getchar()
调用,那么下一个 scanf("%c",&s)
将读取换行符。
如您所述,一种解决方案是使用 getchar()
读取并丢弃换行符。另一个解决方案是让 scanf
做同样的事情:
scanf(" %c",&s);
// ^
// Note the space here!
前导 space 告诉 scanf
跳过并忽略所有前导的白色-space 字符,其中换行符就是一个这样的字符。
请注意,scanf
的大多数格式说明符会自动跳过并忽略前导白色-space。例如 %s
会这样做,这意味着你的第二个版本 scanf("%s",s)
不需要 getchar()
调用。
另请注意,通过在调试器中花五分钟逐个语句单步执行代码,同时监视变量及其值,应该可以轻松推断出这一点。
然后 s == "yes"
。这里发生的是数组 s
将衰减为指向其第一个元素的指针,文字字符串也是如此,然后您比较这些指针以查看它们是否相同,而它们很可能永远不会相同。
它有点简化,等同于:
char yes_literal[4] = "yes";
if (&s[0] == &yes_literal[0]) ...