1

可能重复:
为什么 getchar() 不等我按 Enter 键?

我继续学习 C,在这个阶段我有一些不清楚的地方。当我写一个程序时,printf();最后有几个,我要求用户按 Enter 键完成程序,我必须写getchar();两次,因为当我写一次时它不起作用。我getchar();只在程序结束时使用,其他地方都没有。

我在 Ubuntu 上工作。我用C写。

这是我的最新作品:

#include<stdio.h>
main()
{
int m,n,r,k,q,l;
printf("This program will help you to find GCD & LCM of 2 non-negative integers\n");
printf("Now, you'll be asked to enter your integers, press Enter to continue");
getchar();
printf("Enter first integer:");
scanf("%i", &m);
printf("Enter second integer:");
scanf("%i", &n);
while(m<0 || n<0)
{
printf("The integers cannot be negative! You'll be asked to enter integers again.\n");
printf("Enter first integer:");
scanf("%i", &m);
printf("Enter second integer:");
scanf("%i", &n);
}
while(m==0 && n==0)
{
printf("Both of the integers cannot be zero at the same time! You'll be asked to enter integers again.\n");
printf("Enter first integer:");
scanf("%i", &m);
printf("Enter second integer:");
scanf("%i", &n);
}
if(n>m)
{
int b;
b=n;
n=m;
m=b;
}
r=m%n;
if(r==0)
{
printf("The GCD of these integers is %i\n", n);
printf("The LCM of these integers is %i\n", m);
printf("Press Enter to finish");
getchar();
getchar();
return 0;
}
k=n%r;
while(k>0)
{
r=k;
k=q;
}
l=(m*n)/r;
printf("The GCD of these integers is %i\n", r);
printf("The LCM of these integers is %i\n", l);
printf("Press Enter to finish");
getchar();
getchar();
return 0;
}
4

1 回答 1

2

你需要 2 的原因getchar()是因为

  1. 最后一个scanf()调用ENTER在缓冲区中等待
  2. 第一个getchar()“吃了”ENTER
  3. 第二个getchar()等待输入。

要正确处理用户输入,请使用fgets()sscanf()简单的scanf(). 为这些函数定义一个缓冲区,例如

char buffer[1000];

然后scanf()用这对替换你的电话

fgets(buffer, sizeof buffer, stdin);
sscanf(buffer, "%d", &n);

将来您可能还想检查返回值sscanf()以检测无效输入,例如foo42ENTER

if (sscanf(buffer, "%d", &n) != 1) /* invalid input */;

编辑(使用strtol()而不是sscanf()更好——感谢@Scooter)

char buffer[1000];
char *err;
/* ... */
fgets(buffer, sizeof buffer, stdin); /* error checking ommited */
n = strtol(buffer, &err, 10);
/* error checking ommited */
/* ... */
于 2012-08-04T14:43:05.243 回答