我是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