我正在尝试使用gets和puts获取并打印一个字符串,但是当我一起使用它们时出现段错误错误。 这是我试图让它工作的代码。 [我输入字符串“prova”来测试它]
int main()
{
char *s;
gets(s);
puts(s);
return 0;
}
如果我用“scanf”更改“gets”,我会得到同样的错误。 如果我用“printf(“%s”, s)”更改“puts”,我会得到输出。 如果我声明 char *s = "prova"然后 put(s) 我得到输出。
我还尝试更改 char *s;与 char s[] 但我得到同样的错误。
我哪里错了?非常喜欢
我知道变得很糟糕,只是因为我正在写 Deitel 和 Deitel 的“C 如何编程,第五版”练习
最佳答案
您的这段代码存在多个问题。首先,自 C99 标准以来,gets
已被弃用,并且在 C11 标准中已被删除。原因是它不是很安全,并且没有边界检查,因此可以写入超出传递给它的内存范围,从而导致缓冲区溢出。
其次,您使用未初始化局部变量s
。未初始化变量的值是不确定的,并且看起来是随机的。使用未初始化的局部变量会导致 undefined behavior ,这经常会导致崩溃。
另一个问题是,如果您初始化 s
来指向文字字符串。文字字符串是常量(只读)字符数组,尝试写入它将再次导致未定义的行为。
关于c - gets 和 put 获取并打印字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24578072/