首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场

scanf()
EN

Stack Overflow用户
提问于 2014-03-07 16:12:03
回答 3查看 399关注 0票数 1

为什么程序不停止在第4行接受输入?

代码语言:javascript
运行
复制
int main(int argc, char *argv[])
{
  int a, b;
  char c1, c2;
  printf("Enter something: ");
  scanf("%d",&a); // line 1
  printf("Enter other something: ");
  scanf("%d", &b); // line 2

  printf("Enter a char: "); 
  scanf("%d",&c1); // line 3
  printf("Enter other char: ");
  scanf("%d", &c2); // line 4

  printf("Done"); // line 5

  system("PAUSE");  

  return 0;
}

我从一本书中读到了这个问题,在上面的第4行,scanf()不是在执行,但是为什么呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-07 16:19:21

%d希望从输入中读取一串数字,这样它就可以形成一个整数,并将结果存储到您传递的指针中(在本例中这是无效的,因为您提供了一个指向char的指针,但无论如何,这与此无关)。

问题是,如果您输入一个字符,scanf()会注意到输入中没有有效的数字。它将读取此字符,将其推回输入,并提前返回。这发生在第3行。由于该字符是向后推回的,第4行将再次从输入中检索相同的字符,并看到输入中没有有效的整数,因此相同的字符将再次被推回。

这里要记住的关键一点是,scanf在输入无效的情况下过早返回,而输入流不受影响。

例如,如果stdin保存字符a,则第3行的scanf()将从输入中检索a。它看到这不能是一个有效的数字,因此a“返回”到stdinscanf()返回。在第4行,scanf调用将执行相同的任务:它从输入中选择下一项,即相同的a,并提前返回。在使用此字符之前,整数的扫描将无法工作。例如,如果在第3行之后调用getchar(),就会使用有问题的字符,而第4行的scanf()将等待输入。

票数 2
EN

Stack Overflow用户

发布于 2014-03-07 16:21:27

scanf对换行符有问题。解决这一问题的一种快速而肮脏的方法是在%c之前添加一个空格或一个%c,以绕过这个.

代码语言:javascript
运行
复制
  printf("Enter a char: "); 
  scanf(" %c",&c1); // line 3
  printf("Enter other char: ");
  scanf(" %c", &c2); // line 4
票数 2
EN

Stack Overflow用户

发布于 2014-03-07 17:27:14

代码语言:javascript
运行
复制
 printf("Enter a char: "); 
  scanf("%c",&c1); // line 3
  printf("Enter other char: ");
  scanf("%c", &c2); // line 4

用%c更改%d (从十进制改为字符)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22255087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档