gets()不要求输入,除非在它之前使用getchar()或其他get()

时间:2015-10-19 07:22:39

标签: c string newline fgets gets

我创建了一个包含一些函数的c源文件'functions.c',包含函数原型的头文件'functions.h'和'main.c'源文件。现在我使用main来使用functions.h中的原型来调用functions.c中的函数。以下是'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] != '\0';)
  {
    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-“为什么get()不起作用?为什么gets()不要求任何输入?”

2-“当我在代码中包含getchar()时,它为什么开始要求输入?我的意思是当我从getchar()中删除注释符号时?”

我是新手..所以请软一点......感谢您的回答。

2 个答案:

答案 0 :(得分:2)

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

gets之后,您应该在循环中读取字符,直到您阅读换行符。

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

答案 1 :(得分:0)

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

您的解决方案要么不混合使用scanfgets,要么在每次调用stdin或类似函数后手动清除输入缓冲区scanf。< / p>