任何人都可以告诉我为什么get(abc)可以使用char []但不能使用int?
int abc;
char name[] = "lolrofl";
printf("Hello %s.\n",name);
printf("\n >> ");
fflush(stdin);
gets (abc);
printf("\n die zahl ist %i.\n",abc);
system("Pause");
return(0);
答案 0 :(得分:11)
gets()的原型是:
char* gets(char *s);
请注意,该功能不会只读取单个字符并将其放在s中;它实际上将整个字符串读入s。但是,由于gets()没有提供指定要读取的最大字符数的方法,因此实际上可以读取s中的字符数多于为s分配的字节数。因此,这个函数是一个严重的buffer overflow vulnerability,你不应该使用这个函数。还有其他更安全的功能,可让您阅读用户的输入,例如fgets()和getc()。
如果您使用的是C ++,那么使用C++ I/O Stream Library(std :: cin,std :: cout,std :: ostream,std :: istream,std :: fstream等)会好得多执行输入/输出的方法比使用这些其他功能。
函数gets()是如此危险,事实上,在我的development and coding custom search engine中,我已经在gets上进行了促销,并且其他一些此类函数警告不要使用它!
答案 1 :(得分:4)
因为它只读取字符。使用scanf()进行格式化阅读。
顺便说一句,既然你似乎在使用C ++(或者至少你选择的标签就是这样),也许你应该试试std :: cin / std :: cout。
答案 2 :(得分:1)
如果您查看C参考,您的问题将得到解答。我会为你粘贴它:
char * gets(char * str);
gets()函数读取字符 从stdin并加载到str, 直到达到换行符或EOF。该 换行符被翻译成一个 空终止。的返回值 gets()是读入字符串,或NULL 如果有错误。请注意gets() 不执行边界检查,和 因此有可能超越str。为一个 类似(和更安全)的功能 包括边界检查,请参阅fgets()。
所以你将无法将整个字符串转换为整数。
答案 3 :(得分:0)
首先,gets
函数用于读取字符串或 text ,而不是数字。
其次,不要使用gets
,因为它有缓冲区溢出错误。有关详细信息,请参阅C Language FAQ。函数fgets
是一种更安全的替代方案。
第三,您可能希望切换到C ++流和std::string
。 C ++流比C流更友好。
第四,fflush
在输入流上不起作用。 fflush
函数用于将流缓冲区中的剩余数据写入输出流。在C ++中,有一个方法ignore
,它将忽略传入的字符,直到读取换行符(默认值)或指定的字符(或达到限制)。
希望有所帮助。