2011-09-13 98 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);