我是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;
}
我是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;
}
在C这是典型的父母来处理内存分配,因为没有垃圾收集后自己清理,所以它必须这样做呢:
void get(char *n)
{
printf("\n user name : ");
scanf("%s", n);
}
int main()
{
char c[200];
get(c);
printf("%s", c);
return 0;
}
scanf
正在从stdin
中读取字符并将它们存储在n
指向的内存中。你还没有初始化n
指向任何东西,所以scanf
可能试图将你的输入存储在内存中的任意位置。你很幸运,它崩溃而不是安静地行事,就好像它正常运转一样。
从C函数返回一个字符串比您期望的要复杂。
有(至少)三个一般的方法:
要求呼叫者的指针传递到(第一元件)的阵列到其中的字符串是要被存储,随着另一参数告诉函数数组有多大。如果数组的大小不足以保存结果,则可能需要进行错误处理。
在函数内部声明一个static
数组并返回一个指向它的指针。 (你不能返回一个指向非静态本地数组的指针,因为当函数返回时数组不再存在)。问题:多个调用使用相同的存储空间(特别是在线程存在时存在问题),并且分配大小是固定的。
使用malloc()
在函数内部分配结果。这要求调用者以free()
的结果。
推荐阅读:comp.lang.c FAQ。特别是,问题7.5b几乎是对你的问题的直接回答(如果我早些时候意识到的话,会为我节省一些打字的时间)。 (我通常不会链接到个人的问题,因为我想鼓励人们浏览。)
编辑:此外,scanf
与不合格"%s"
格式本身就是不安全的。它会尝试存储在数组中输入的很多字符;没有办法避免缓冲区溢出(比如,如果你的猫坐在键盘上)。 @Artefacto在评论的链接中提到了这个问题。
首先你musst为您的字符串分配内存的
可以动态地使用malloc做;
例如尺寸为200:
#include <stdlib.h>
char (*n)[200] = malloc(sizeof *n);
不要忘记
free(n);
解放指针你需要一个缓冲那里写。和http://c-faq.com/stdio/scanfprobs.html – Artefacto
非常感谢信息... – srisar
[不要使用'scanf()'](http://c-faq.com/stdio /scanfprobs.html)(通过@Artefacto链接),使用'fgets()'代替http://ideone.com/oUAbk – jfs