私の提案は十分なサイズのバッファを割り当てるために、次のようになります。
char name_buffer [ 80 ];
一般的に、ほとんどの名前(少なくとも一般的な英語名)が80文字未満のサイズになります。あなたがそれよりも多くのスペースを必要とするかもしれないと感じたら、是非、もっと多くを配分してください。
あなたはすでにあなたのバッファに読み込まれているどのように多くの文字を知っているカウンター変数を保持:
int chars_read = 0; /* most compilers will init to 0 for you, but always good to be explicit */
この時点で、あなたはファイルマーカーの終わりを打つか、80を読んでどちらかまでfgetc()
と文字で文字を読んであなたはヌルターミネーターのためのスペースが必要なので79文字です。読み込んだ各文字をバッファに格納し、カウンタ変数をインクリメントします。
while ((chars_read < 80) && (!feof(stdin))) {
name_buffer [ chars_read ] = fgetc (stdin);
chars_read++;
}
if (chars_read < 80)
name_buffer [ chars_read ] = '\0'; /* terminating null character */
私はあなたがstdin
から読んでいることを、ここで想定しています。より完全な例では、エラーをチェックし、ストリームから読み込んだ文字が人の名前(数字など)に有効であることを確認します。スペースを割り当てたよりも多くのデータを読み込もうとすると、コンソールにエラーメッセージが表示されます。
私は、できるだけ小さなバッファを維持し、必要なものだけを割り当てたいと考えていますが、プログラムの学習方法の一部は、コード/データサイズ、効率、コードの可読性のトレードオフを理解することです。 malloc
とrealloc
でも可能ですが、コードが必要以上に複雑になり、NULLポインタ、配列インデックスの範囲外エラーなどが発生する可能性があります。ほとんどの場合、十分なものを割り当てる必要がありますあなたのデータ要件に加えて少量の呼吸室が必要です。データがバッファのサイズを超えている場合が多い場合は、それに合わせてバッファを調整します。つまり、デバッグとテストの場合です。
サイズを倍増するreallocの提案を編集しても問題はありません。あなたはおそらく十分な大きさの配列から始めることができます(学生名であることがわかっていれば)、ほとんどの場合reallocを避けてください。 Supercalifragilisticsuperalidosciousさんは、あなたの学校に行きません。 –
@ポール - あなたは確かに彼は彼に? – DMan
文字を正確に正しいサイズの新しいメモリにコピーする必要はありません。最後に 'realloc()'をもう一度使って、割り当てられたブロックを正しいサイズにトリムすることができます。 – caf