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()?"
我是新手..所以请慢慢来..感谢您的回答。
问题是你混合使用了scanf
和gets
:当你使用scanf
读取数字时,用户按下的换行符将在输入缓冲区中,并且scanf
调用不会删除它。但是,当您循环回调用 gets
时(顺便说一句,不要使用标签和 goto
进行循环!) gets
调用会读取该换行符并将其视为空行。
在 scanf
之后,您应该循环读取字符,直到您读取换行符。
重要说明:您可能会看到一些地方使用 fflush(stdin)
到 "flush" 输入缓冲区(即丢弃所有到(并包括)换行符)。根据 C 规范,这在技术上是 未定义的行为。有些环境将它作为扩展,但如果你想要正确和便携,你不应该使用它。
gets(string)
从标准输入缓冲区 stdin
读取。如果您在程序的任何其他位置使用 scanf()
,用户提交 scanf
输入时按下的换行符 ('\n'
) 仍将位于 stdin
中,除非您手动清除它。 gets(string)
然后会将其解释为空行。
您的解决方案是不要混合使用 scanf
和 gets
或在每次调用 scanf
或类似函数后手动清除输入缓冲区 stdin
.
我制作了一个包含一些函数的 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()?"
我是新手..所以请慢慢来..感谢您的回答。
问题是你混合使用了scanf
和gets
:当你使用scanf
读取数字时,用户按下的换行符将在输入缓冲区中,并且scanf
调用不会删除它。但是,当您循环回调用 gets
时(顺便说一句,不要使用标签和 goto
进行循环!) gets
调用会读取该换行符并将其视为空行。
在 scanf
之后,您应该循环读取字符,直到您读取换行符。
重要说明:您可能会看到一些地方使用 fflush(stdin)
到 "flush" 输入缓冲区(即丢弃所有到(并包括)换行符)。根据 C 规范,这在技术上是 未定义的行为。有些环境将它作为扩展,但如果你想要正确和便携,你不应该使用它。
gets(string)
从标准输入缓冲区 stdin
读取。如果您在程序的任何其他位置使用 scanf()
,用户提交 scanf
输入时按下的换行符 ('\n'
) 仍将位于 stdin
中,除非您手动清除它。 gets(string)
然后会将其解释为空行。
您的解决方案是不要混合使用 scanf
和 gets
或在每次调用 scanf
或类似函数后手动清除输入缓冲区 stdin
.