2009-06-04 11 views
1

char first [10];fscanf - 長すぎる文字列を使用しています。

char second [10];

fscanf(fr、 "%s%s \ n"、最初、秒)とは何ですか?最初の文字列が長すぎる場合はどうしますか?

mallocなしでchar * firstを使用できますか?ポインタは文字列に表示されますか?

答えて

3

文字列のサイズを制限するために幅(「%9s」)を使用できます。たとえば、Microsoft's documentationを参照してください。

ポインタを何かに初期化せずに使用すると、プログラムをクラッシュさせたり、そうでなければひどく振舞うことができます。最初の文字列が長すぎると

+0

しかし、私は10よりも小さい文字列を持つことができます。その場合、私はそれをすべて得られません。 – feiroox

+1

文書から:「空白文字(スペース、タブ、または改行)または指定された書式に従って変換できない文字が幅に達する前に発生すると、幅文字が読み込まれない可能性があります。 –

+1

さらにもう1つ - fscanfに与えられる幅は、ヌルターミネータを可能にするために、文字列のサイズよりも1つ小さくなければなりません。私の例を更新します。 –

1

は、あなたがmalloc関数を使用しない場合には、それはゴミのメモリを指します、あなたの質問の後半部分についてbuffer overflow.

としての問題に遭遇します。その文字列がしばらくそこにとどまる可能性はありますが、保証されていない可能性があります。そのメモリセグメントが他のものによって使用されている場合は、文字列を失います。

2

glibcを使用している場合は、両方の問題をワンショットで解決できます。フォーマット指定子は%asです。

コンテンツを保持するのに十分な大きさの文字列を自動的に割り当てます。このよう

char *first, *second; 

scanf(fp, "%as %as\n", first, second); 

注:これはGNU拡張であります!

+0

ありがとう。それは残念だそれは窓の下ではない:) – feiroox

関連する問題