C:一个变量输入错误,我的;“输入不正确”;如果启动并没有';不要让用户完成其余变量的输入

C:一个变量输入错误,我的;“输入不正确”;如果启动并没有';不要让用户完成其余变量的输入,c,C,问题是,基本上,如果用户输入a:5,b:f,一切正常。但是如果是另一种方式,并向“a”变量输入一个字母,程序会以“输入不正确”结束,而不会让用户完成其余变量的输入。为什么?是因为我一开始就检查输入是否正确吗?在用户输入完变量后,如何“延迟”消息并使其显示 代码如下: #include <stdio.h> int main(void) { short int l1=0, l2=0, l=0; int a=0, b=0; printf("Is number 'a' di

问题是,基本上,如果用户输入a:5,b:f,一切正常。但是如果是另一种方式,并向“a”变量输入一个字母,程序会以“输入不正确”结束,而不会让用户完成其余变量的输入。为什么?是因为我一开始就检查输入是否正确吗?在用户输入完变量后,如何“延迟”消息并使其显示

代码如下:

#include <stdio.h>

int main(void) {

  short int l1=0, l2=0, l=0;
  int a=0, b=0;

  printf("Is number 'a' divisible by number 'b'?\n");
  printf("Number a: ");
  l1 = scanf("%d", &a);
  printf("Number b: ");
  l2 = scanf("%d", &b);

  l=l1+l2;

  if (l<2)
  {
  printf("Incorrect input");
  return 1;
  }
  else if (b==0)
    {
      printf("Operation not permitted");
      return 1;
    } 
    else if (a%b)
      {
        printf("%d is not divisible by %d", a, b);
      }
      else printf("%d is divisible by %d", a, b);

  return 0;
}
#包括
内部主(空){
短整数l1=0,l2=0,l=0;
int a=0,b=0;
printf(“数字‘a’可被数字‘b’整除吗?\n”);
printf(“数字a:”);
l1=扫描频率(“%d”和“&a”);
printf(“数字b:”);
l2=扫描频率(“%d”和“b”);
l=l1+l2;

如果(l如Weather Vane所指出的,程序退出的原因是,当您输入字符(%c)且scanf函数正在等待整数(%d)时,它忽略该字符,没有找到整数,而是结束其对“\n”(enter)的搜索,因此变量
l1
保持为0。对于所有scanf调用都会发生这种情况,因为它不会清除不匹配字符的缓冲区

解决这个问题
您可以清除输入缓冲区,以便所有其他scanf调用都可以获得实际的输入,但是,最后仍然会得到“不正确的输入”

printf("Number a: ");
l1 = scanf("%d", &a);
while (getchar() != '\n');

printf("Number b: ");
l2 = scanf("%d", &b);
while (getchar() != '\n');
如果要重复输入过程直到用户正确输入数字,则必须在while循环中检查
scanf
的返回值,如下所示:

do {
printf("Number a: ");
    l1 = scanf("%d", &a);
    while (getchar() != '\n');
} while (l1 != 1 || l1 != EOF);
试试这个:

#include <stdio.h>

int main(void) {

  short int l1=0, l2=0, l=0;
  int a=0, b=0;

  printf("Is number 'a' divisible by number 'b'?\n");
  printf("Number a: ");
  l1 = scanf("%d", &a);
  getchar();
  printf("Number b: ");
  l2 = scanf("%d", &b);

  l=l1+l2;

  if (l<2)
  {
  printf("Incorrect input");
  return 1;
  }
  else if (b==0)
    {
      printf("Operation not permitted");
      return 1;
    } 
    else if (a%b)
      {
        printf("%d is not divisible by %d", a, b);
      }
      else printf("%d is divisible by %d", a, b);

  return 0;
}
#包括
内部主(空){
短整数l1=0,l2=0,l=0;
int a=0,b=0;
printf(“数字‘a’可被数字‘b’整除吗?\n”);
printf(“数字a:”);
l1=扫描频率(“%d”和“&a”);
getchar();
printf(“数字b:”);
l2=扫描频率(“%d”和“b”);
l=l1+l2;

如果(t这是因为不正确的输入仍保留在输入缓冲区中。因此,如果您为第一个输入输入一个字母,则第二个输入已经有数据等待它。因此,两个输入都拒绝相同的字母。无论您尝试将其作为数字扫描多少次,它都会保留在那里。哦,好的,谢谢!有可能以某种方式克服吗这段代码可以让你完成对变量的编码,即使它不会改变克服(显然)?很抱歉,这似乎是一个非常棘手的问题,但能够在每种情况下输入每个变量是我必须满足的要求之一。根据我所看到的这一练习。有两个答案显示了解决问题的两种不同方法。一种方法清除输入。另一种方法首先输入字符串,然后忘记出现错误时的字符串。我对编码还不太熟悉,不知道什么样的解决方案实际上可行,什么样的解决方案不可行,需要一个提示来寻找。非常感谢!我真的很感激。你也应该检查
EOF
。…但实际上,除非你知道以后的输入必须被删除,否则你不应该清除它第一,在正常运行中,换行符将被下一个
scanf
清除(除了
%c
说明符和一些字符串扫描集)。@WeatherVane在这种情况下,清除不匹配输入的正确方法是什么?因此,如果我理解正确,在第一个
scanf()
调用时,输入缓冲区有一个
\n
,然后在下一次调用
scanf()时
,它看到一个
\n
已经在输入缓冲区中,并且几乎不尝试从
stdin
?@AndyJ中读取任何内容,但是第二个scanf调用确实读取了输入缓冲区,但将前一个输入视为第一个scanf没有清除它。这就是为什么在我的实现或Kanji的实现中需要getchar()。