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那一行)

参考技术A

应该和这句代码有关。建议换个正数。

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()问题的主要内容,如果未能解决你的问题,请参考以下文章

C语言中如何用 gets(),put()

《C语言杂记》C语言使用gets函数出现的警告问题

C语言中如何用gets();语句来接收一个二维数组

C语言如何用GETS输入2维数组

C语言字符串gets(str)

C语言 gets()和scanf()函数的区别