得到(变量)

时间:2010-04-22 19:21:13

标签: c++ gets

任何人都可以告诉我为什么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);

4 个答案:

答案 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,它将忽略传入的字符,直到读取换行符(默认值)或指定的字符(或达到限制)。

希望有所帮助。