c - gets 和 put 获取并打印字符串

标签 c stdio gets puts

我正在尝试使用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/

相关文章:

c - 如何显示字符串表中的元素

C 编程帮助 - 用户退出程序的选项

c - 如何在以下代码中使用 gets() ?

c - gets 有用吗?

c - gets() 在 scanf 之后如何工作?

android - 通过低功耗蓝牙从设备发送到 Android 应用程序的数据格式

c - C 结构体中灵活的结构体数组

c - 将用户输入存储在变量中

c - 忽略 C 中的换行符

c - 没有 "-std=c99"的巨大 fprintf 速度差异