をscanf
はstdin
の文字を読み込み、n
が指し示すメモリに保存しています。 n
を初期化していないので、scanf
はおそらくメモリ内の任意の場所に入力を保存しようとしています。あなたは、それが正しく動作しているかのように静かに行動するのではなく、クラッシュすることが幸運です。
C関数から文字列を返すのは、予想以上に複雑です。
(少なくとも)は、3つの一般的なアプローチがある:
は(の最初の要素)へのポインタを渡す文字列が別のと一緒に、記憶されるべきれる配列を発信者が必要に配列の大きさを関数に伝える引数。配列が結果を保持するのに十分な大きさでない場合は、エラー処理が必要になることがあります。
static
配列を関数内に宣言し、そのポインタを返します。 (関数が返っても配列は存在しなくなるので、非静的なローカル配列へのポインタを返すことはできません)問題:複数の呼び出しが同じ記憶領域を使用する(特にスレッド化があると問題がある)サイズは固定です。
malloc()
を使用して関数内に結果を割り当てます。これには、発信者にfree()
が必要です。
推奨読書:comp.lang.c FAQ。特に質問7.5bはあなたの質問にほぼ直接的に答えています。 (私は閲覧する人を奨励するために好きなので、私は通常、個々の質問にリンクしていない)
EDIT:はまた、修飾されていない"%s"
形式でscanf
は本質的に安全です。配列には多くの文字が入力されますが、格納しようとします。バッファオーバーランを避ける方法はありません(例えば、あなたの猫がキーボードに座っている場合)。 @Artefactoはコメントのリンクでこの問題を参照しました。
とポインタを解放することを忘れないでください。そして、http://c-faq.com/stdio/scanfprobs.html – Artefacto
は、情報のために多くのおかげで... – srisar
['scanf()'を使用しない](http://c-faq.com/stdio /scanfprobs.html)(@Artefactoによってリンクされています)、代わりに 'fgets()'を使用してください。http://ideone.com/oUAbk – jfs