2013-10-12 68 views
1

我现在在大学学习C语言。我想从用户那里获得输入,然后在屏幕上打印出来。我尝试了scanf和fgets,它们都崩溃了。请帮助我需要了解如何获取输入并打印出来。问题与用户输入

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

int main() 
{ 
    char name[256]; 
    printf("Write something:\n"); 
    gets(name); 
    printf("You wrote: %s", name) ; 
    return 0; 
} 
+2

上面的代码[韩元” t崩溃](http://ideone.com/EVHS3S),除非有缓冲区溢出,请避免使用'gets' – P0W

+0

因为它唯一不会崩溃的....抱歉!我真的在几个小时内搜索了stackoverflow,我没有发现类似的问题。 – valkon

回答

3
gets

是危险的和弃用:

由于用户不能指定传递给 缓冲区的长度得到(),该函数的使用是不鼓励。字符串 的长度为无限制。有可能以这种方式溢出缓冲区,导致应用程序失败或可能的系统安全 违规。

使用fgets代替:

fgets(name, 256, stdin); 

fgets(name, sizeof(name), stdin); 

,它不会崩溃(即使你键入超过255个字符)

+0

谢谢你这么多! – valkon

+0

欢迎您:) –

1

千万不要使用gets。它不提供针对缓冲区溢出漏洞的保护措施(也就是说,您不能告诉它传递给它的缓冲区有多大,因此它不能阻止用户输入大于缓冲区和破坏内存的行)。
gets()不允许您指定要存储字符串的缓冲区的长度。这将允许人们在缓冲区末尾输入数据。
fgets将永远读取新行,如果缓冲区足够大,以容纳它(它可以让你知道什么时候缓冲区太小,有更多的线路等待读取)。

+0

那么根据你'printf'是否可能导致崩溃? – P0W

+0

@ P0W;没有。当然,这是缓冲流。 – haccks