2014-08-31 149 views
2

所以基本上我学习C,他们教我们使用gets()函数,我发现它被删除,不能再使用。所以我试图学习使用替代方法,gets_s()函数,但我似乎无法。例如试图编译:在下面的代码给了我“未定义参考gets_s”未定义的引用gets_s

char line[21]; 
gets_s(line, 20); 
printf("The line entered was: %s\n", line); 

很多人说用fgets()代替gets()函数,但我不知道怎么说将工作,因为我想读取用户的输入,而不是从文件中读取。

+0

您需要包含一个标题,而不是定义'gets_s'。 – 2014-08-31 15:55:55

+1

'gets_s'仅在MSVC中可用。使用'fgets'。 – 2014-08-31 16:02:21

+1

更好的是,如果你的系统有它(比如最近的Posix规范),可以使用'getline'。它动态地为线路分配缓冲区,因此可以接受非常大的线路(如果系统资源允许的话)。 – 2014-08-31 16:04:22

回答

4

函数gets_s不是一个一流的标准函数。它由Visual Studio(mentioned on MSDN)执行,如果包含stdio.h,则可以使用它。

有趣的是C11引入其作为有些标准功能通过在附录K提它,“边界检查接口”与其他_s功能一起。然而,许多编译器选择不实现这个接口,所以最好不要依赖它。

重申一下user3121023说,fgets可能是要走的最安全的方式(但如果你能,你应该使用sizeof):

fgets(line, sizeof line, stdin); 

注意你不需要通过比一个少数组大小为

+0

如果您要将代码从MSVC转换为标准化C,则可以在更新所有引用的同时使用'#DEFINE gets_s(x,len)fgets((x),(len)+ 1,stdin)''我建议反对它。一个简单的'sed'命令会更好。 – 2014-08-31 17:04:07

+0

['get_s'](http://en.cppreference.com/w/c/io/gets)是C11标准的一部分。 – 2014-10-21 18:45:06