如何从C中返回字符串的函数中捕获字符串?

时间:2011-09-13 19:28:11

标签: c

我是C的新手,我创建了以下代码,但运行时程序崩溃了。为什么?如何阻止它崩溃?

char *get()
{
    char *n;
    printf("\n user name : ");
    scanf("%s", &n);
    return n;
}

int main()
{
    char *c = get();

    printf("%s", c);

    return 0;
}

3 个答案:

答案 0 :(得分:4)

在C中,父级通常会处理内存分配,因为没有垃圾收集器可以自行清理,所以无论如何都必须这样做:

void get(char *n)
{
    printf("\n user name : ");
    scanf("%s", n);
}

int main()
{
    char c[200];
    get(c);
    printf("%s", c);

    return 0;
}

http://ideone.com/Tw347

答案 1 :(得分:3)

scanf正在读取stdin中的字符并将其存储在n指向的内存中。您尚未初始化n指向任何内容,因此scanf可能会尝试将您的输入存储在内存中的某个任意位置。你很幸运它崩溃而不是安静地表现得好像它正常工作一样。

从C函数返回一个字符串比你想象的要复杂得多。

有(至少)三种一般方法:

  1. 要求调用者传入指向要存储字符串的数组(的第一个元素)的指针,以及另一个告诉函数该数组有多大的参数。如果数组不足以容纳结果,则可能需要进行错误处理。

  2. 在函数内声明一个static数组并返回指向它的指针。 (您不能返回指向非静态本地数组的指针,因为当函数返回时,数组不再存在。)问题:多个调用使用相同的存储空间(在存在线程时尤其有问题),并且已分配大小是固定的。

  3. 使用malloc()在函数内分配结果。这要求来电者free()得到结果。

  4. 推荐阅读:comp.lang.c FAQ。特别是,问题7.5b几乎是你问题的直接答案(如果我早些时候意识到这一点,我会为我节省一些打字)。 (我通常不会链接到个别问题,因为我喜欢鼓励人们浏览。)

    编辑:此外,scanf格式不合格"%s"本质上也不安全。它将尝试存储但是在数组中输入了许多字符;没有办法避免缓冲区溢出(例如,如果你的猫坐在键盘上)。 @Artefacto在评论链接中提到了这个问题。

答案 2 :(得分:1)

首先,你要为你的字符串分配内存

您可以使用malloc;

动态地执行此操作

例如,尺寸为200

#include <stdlib.h>

char (*n)[200] = malloc(sizeof *n);

不要忘记用

解放指针
free(n);