2011-09-13 62 views
0

我是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; 
} 
+0

解放指针你需要一个缓冲那里写。和http://c-faq.com/stdio/scanfprobs.html – Artefacto

+0

非常感谢信息... – srisar

+0

[不要使用'scanf()'](http://c-faq.com/stdio /scanfprobs.html)(通过@Artefacto链接),使用'fgets()'代替http://ideone.com/oUAbk – jfs

回答

3

在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

3

scanf正在从stdin中读取字符并将它们存储在n指向的内存中。你还没有初始化n指向任何东西,所以scanf可能试图将你的输入存储在内存中的任意位置。你很幸运,它崩溃而不是安静地行事,就好像它正常运转一样。

从C函数返回一个字符串比您期望的要复杂。

有(至少)三个一般的方法:

  1. 要求呼叫者的指针传递到(第一元件)的阵列到其中的字符串是要被存储,随着另一参数告诉函数数组有多大。如果数组的大小不足以保存结果,则可能需要进行错误处理。

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

  3. 使用malloc()在函数内部分配结果。这要求调用者以free()的结果。

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

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

1

首先你musst为您的字符串分配内存的

可以动态地使用malloc做;

例如尺寸为200

#include <stdlib.h> 

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

不要忘记

free(n);