-1

我正在尝试使用gets和puts获取和打印一个字符串,但是当我一起使用它们时出现分段错误错误。这是我试图让它工作的代码。[我输入字符串“prova”来测试它]

int main()
{
    char *s;
    gets(s);
    puts(s);
    return 0;
}

如果我用“scanf”更改“gets”,我会得到同样的错误。如果我用 "printf("%s", s)" 改变 "puts" 我得到输出。如果我声明 char *s = "prova" 然后 puts(s) 我得到输出。

我也试图改变 char *s; 使用 char s[] 但我得到了同样的错误。

我在哪里错了?非常非常

我知道gets很糟糕,只是因为我正在写Deitel和Deitel的“C如何编程,第五版”中的练习

4

3 回答 3

3

这段代码有多个问题。首先,gets自 C99 标准以来已弃用,在 C11 标准中已将其删除。原因是它不是很安全,并且没有边界检查,因此可以写入超出您传递给它的内存的边界,从而导致缓冲区溢出。

其次,您使用未初始化的局部变量s。未初始化变量的值是不确定的,并且看起来是随机的。使用未初始化的局部变量会导致未定义的行为,这通常会导致崩溃。

另一个问题是如果你初始化s指向一个文字字符串。文字字符串是常量(只读)字符数组,尝试写入它会再次导致未定义的行为。

于 2014-07-04T16:19:59.157 回答
2

您需要为字符串分配一些空间:

char s[256];
gets(s);
puts(s);

但是不好gets_ (它不知道你的缓冲区有多大,那么如果读取超过 255 个字符会怎样?)

于 2014-07-04T16:18:42.853 回答
0

您遇到的最重要的错误是您声明了一个 char 指针,但是您没有在内存中保留将存储字符的空间,因此您得到了一个指向您不应该使用的随机内存地址的指针。要做的“正确”事情是:

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

#define LENGHT 20
int main()
{
    char *s;
    s=malloc(sizeof(char)*LENGHT);  //here you make the pointer point to a memory adress that you can use
    gets(s);
    puts(s);
    free (s);
    return 0;
}

但也强烈建议避免使用gets,因为该函数不检查输入的长度,因此使用fgets 代替它允许您这样做,您只需将数据流设置为stdin。代码将是:

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

#define LENGHT 20
int main()
{
    char *s;
    s=malloc(sizeof(char)*LENGHT);
    fgets(s,20,stdin);
    puts(s);
    free(s);
    return 0;
}
于 2014-07-04T16:31:53.833 回答