获取并放置以获取并打印字符串

时间:2014-07-04 16:16:01

标签: c stdio gets puts

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

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

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

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

我在哪里错了?很多

我知道得到的很糟糕,只是因为我正在编写Deitel和Deitel的“C how to program,5th edition”练习

3 个答案:

答案 0 :(得分:3)

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

其次,您使用未初始化的本地变量s。未初始化变量的值是不确定的,并且看似随机。使用未初始化的局部变量会导致undefined behavior,这通常会导致崩溃。

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

答案 1 :(得分:2)

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

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

getsbad。 (它不知道你的缓冲区有多大,如果读取超过255个字符会发生什么?)

答案 2 :(得分:0)

你遇到的最重要的错误就是你正在声明一个字符指针,但是你没有在内存中保留字符存储的空间,所以你得到一个指向某个随机内存地址的指针你应该# 39;使用。 "权利"要做的事情是:

#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;
}