2011-09-13 11 views
0

私はC言語を新しくしており、次のコードを作成しましたが、プログラムを実行するとクラッシュします。どうして?どうやってクラッシュするの? 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

親がメモリの割り当てを処理するために自分の後にクリーンアップするには何のガベージコレクタはありませんので、それは典型的なものであるので、とにかくことを行う必要があります。

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

scanfstdinの文字を読み込み、nが指し示すメモリに保存しています。 nを初期化していないので、scanfはおそらくメモリ内の任意の場所に入力を保存しようとしています。あなたは、それが正しく動作しているかのように静かに行動するのではなく、クラッシュすることが幸運です。

C関数から文字列を返すのは、予想以上に複雑です。

(少なくとも)は、3つの一般的なアプローチがある:

  1. は(の最初の要素)へのポインタを渡す文字列が別のと一緒に、記憶されるべきれる配列を発信者が必要に配列の大きさを関数に伝える引数。配列が結果を保持するのに十分な大きさでない場合は、エラー処理が必要になることがあります。

  2. static配列を関数内に宣言し、そのポインタを返します。 (関数が返っても配列は存在しなくなるので、非静的なローカル配列へのポインタを返すことはできません)問題:複数の呼び出しが同じ記憶領域を使用する(特にスレッド化があると問題がある)サイズは固定です。

  3. malloc()を使用して関数内に結果を割り当てます。これには、発信者にfree()が必要です。

推奨読書:comp.lang.c FAQ。特に質問7.5bはあなたの質問にほぼ直接的に答えています。 (私は閲覧する人を奨励するために好きなので、私は通常、個々の質問にリンクしていない)

EDIT:はまた、修飾されていない"%s"形式でscanfは本質的に安全です。配列には多くの文字が入力されますが、格納しようとします。バッファオーバーランを避ける方法はありません(例えば、あなたの猫がキーボードに座っている場合)。 @Artefactoはコメントのリンクでこの問題を参照しました。

1

あなたが動的にmalloc関数を使用してそれを行うことができ、あなたの文字列

にメモリを割り当てるmusstまず第一に、 200の大きさを持つ例えば

#include <stdlib.h> 

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

はあなたが書くためのバッファが必要

free(n); 
関連する問題