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