C语言gets()问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言gets()问题相关的知识,希望对你有一定的参考价值。
这个程序是想判断是否是C语言合法标识符,可是gets函数在这里就像罢工似的,根本不执行,先输入样例个数(这是ACM入门题,所以会有这个要求),我一运行先输入3,还没等输入字符串直接来个no,如果不是字符串带空格我才不用gets,最近用这个频繁出毛病,放在循环里也不能读多个字符串,代码如下。
参考技术A 因为你在使用gets之前还使用过别的读入函数(或宏),有的是不会把末尾的换行读取掉的,就会留在缓冲区,当你调用gets时,把上一次的换行字符给读取了,所以就像直接跳过了。改善的方法是为gets函数上一句加上getchar();用于吸收回车。或是加fflush(stdin);刷新缓冲区。 参考技术B 应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。如果溢出,多出来的字符将被写入到缓冲区后面的内存位置,这将破坏一个或多个不相关变量的值。
可能是buffer缓冲区不够大造成的,也或者异常终止是gets使用错误。 参考技术C #include<stdio.h>
#include<ctype.h>
int main(void)
char s[81];
int i,n,f;
scanf("%d",&n);
while(n--)
fflush(stdin);
gets(s);
if(s[i] >= '0'&&s[i] <= '9')
f = 0;
continue;
else
for (i = 1; s[i]; ++i)
if(isdigit(s[i])||isalpha(s[i])||(s[i] == '_')) f = 1;
else f = 0;
if(f) printf("YES\\n");
else printf("NO\\n");
return 0;
参考技术D 1.gets是以回车为结尾的.
你在字符串中提前键入的回车
2.
是缓存区问题..
有可能是没有在gets
之前清空缓存区.
导致上文的输入被当作gets的了 第5个回答 2019-03-16 gets
和scanf混用时要在
scanf
后面加getchar
因为scanf
不接受回车和空格
所以要getchar过滤掉回车和空格
然后才能用gets来完整的接受
C语言有头文件但是说gets仍然未定义
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
/*int chdir(char *path)
chdir("C:\\Users\\dell\\Desktop\\Dataset");
*/
int main(int argc, char *argv[])
int i = 0;
int choice = 0;
int choice2 = 0;
char manual[20]="manual";
char script[20]="script";
char exactSearch[50]="exactSearch";
for(; i<argc; i++)
if(strcmp(manual,argv[i])==0)
choice=1;
if(strcmp(script,argv[i])==0)
choice = 2;
if(strcmp(exactSearch,argv[i])==0)
choice2 = 1;
if(choice == 1)
int termsNumber = 0;
printf("You choose the manual mode.\n");
printf("Then you have to enter query term, separated by space and confirm by enter key.\n");
printf("But before that how many query terms you want to enter? Pls enter your answer:");
scanf("%d",&termsNumber);
printf("Then enter your query terms:\n");
char queryterm[termsNumber][1024];
for(int i =0; i < termsNumber; i++)
gets(queryterm[i]);
for(int i = 0; i<termsNumber; i++)
puts(queryterm[i]);
warning #2018: Undeclared function 'gets' (did you mean: getc?); assuming 'extern' returning 'int'.
warning #2242: Call to 'strcmp' removed.(指的是exactSearch那一行)
应该和这句代码有关。建议换个正数。
int termsNumber = 0;追问还是不行
追答换为正数以后也会报 warning,但是不影响使用。
追问哇真的诶…那么第二个warning又是什么呢?那个Call to 'strcmp' removed
追答你说的这一行代码没看出有什么问题。另外 i 要从 1 开始,因为 argv[0] 代表的是程序本身的执行路径,通常都不会使用,传入的参数是从 argv[1] 开始的。
本回答被提问者采纳 参考技术B这个函数在新标准里已经被弃用了,可以使用gets_s函数代替gets,gets_s是gets的安全版本
char* __cdecl gets_s(char* _Buffer,
rsize_t _Size
);
官方文档
如果一定要用gets,暂时不知道有什么好方法
追问gets_s也试过了,还是未定义
以上是关于C语言gets()问题的主要内容,如果未能解决你的问题,请参考以下文章