gets() 不要求输入,除非在它之前使用 getchar() 或另一个 gets()

gets() not asking for input unless getchar() or another gets() is used before it

我制作了一个包含一些函数的 c 源文件 'functions.c',一个包含函数原型的头文件 'functions.h',以及一个 'main.c' 源文件。现在我使用 main 调用 functions.c 中的函数,使用 functions.h 中的原型。下面是 'functions.c' 文件中的函数。

我的代码:

#include "functions.h"
#include <stdio.h>
#include <string.h>

void func1(void)
{
  int i, j, k, l;
  char string[25];
  printf("Enter any valid 10 digit mobile number\n");
  here:
  //getchar();
  gets(string);

  j = k = 0;
  for (i = 0; string[i] != '[=10=]';)
  {
    if (string[i] <= 57 && string[i] >= 48)
      i++;
    else if (string[i] == 45 || string[i] == 46 || string[i] == 47 || string[i] == 42 || string[i] == 95 || string[i] == 124 || string[i] == 58 || string[i] == 92 || string[i] == 59 || string[i] == 0)
    {
      i++;
      k++;
    } //some special characters allowed
    else
    {
      printf("%c is not a valid digit or symbol for a mobile number\n", string[i]);
      j++;
      i++;
    }
  }
  if ((i - k) == 10 && j == 0)
    printf("Mobile number is valid\n");
  if ((i - k) != 10 || j != 0)
  {
    printf("Mobile number is invalid\nEnter 1 to try again or 2 to exit\n");
    scanf("%d", &l);
    if (l == 1)
    {
      printf("Enter mobile number again\n");
      goto here;
    }
    else if (l == 2)
      printf("Program Terminating\n");
    else
      printf("You didn't enter either of 1 or 2\nProgram Terminating\n");
  }
}

现在我的问题是 -

1-"Why is gets() not working? Why is gets() not asking for any input?"

2-"Why does it start asking for input when i include getchar() in the code? I mean when i remove the comment sign from the getchar()?"

我是新手..所以请慢慢来..感谢您的回答。

问题是你混合使用了scanfgets:当你使用scanf读取数字时,用户按下的换行符将在输入缓冲区中,并且scanf 调用不会删除它。但是,当您循环回调用 gets 时(顺便说一句,不要使用标签和 goto 进行循环!) gets 调用会读取该换行符并将其视为空行。

scanf 之后,您应该循环读取字符,直到您读取换行符。


重要说明:您可能会看到一些地方使用 fflush(stdin) 到 "flush" 输入缓冲区(即丢弃所有到(并包括)换行符)。根据 C 规范,这在技术上是 未定义的行为。有些环境将它作为扩展,但如果你想要正确和便携,你不应该使用它。

gets(string) 从标准输入缓冲区 stdin 读取。如果您在程序的任何其他位置使用 scanf(),用户提交 scanf 输入时按下的换行符 ('\n') 仍将位于 stdin 中,除非您手动清除它。 gets(string) 然后会将其解释为空行。

您的解决方案是不要混合使用 scanfgets 或在每次调用 scanf 或类似函数后手动清除输入缓冲区 stdin .