2012-02-04 12 views
1

私は、後で使用するためにchar配列にロードされる一連のcharを入力する必要があるプログラムを作成しています。私は仕事に取得しようとしていたコードのようになります。セグメンテーションフォールトを取得中にgetchar()を使用する(コアダンプされた)

char temp = getchar(); 
while(temp != '\n'){//input char into temp until '\n' 
    input[strlen(input)] = temp;//adds temp to end of input 
    temp = getchar(); 
} 

が、私はプログラムの中でこのラインに到達したとき、私は「セグメンテーションフォールト(コアダンプ)」やクラッシュを取得... 私は、\ nを交換他の文字と、例えば%

char temp = getchar(); 
while(temp != '%'){//input char into temp until '\n' 
    input[strlen(input)] = temp;//adds temp to end of input 
    temp = getchar(); 
} 

は、それが正常に動作しますが、私は改行ではなく%を使用します。私はいくつかのチュートリアルを見てきました、そして、彼らは入力がヒットするまで入力する方法だと言いました。私は問題が何であるか分かりません。前もって感謝します。

+1

それはどのようにして初期化するのですか? –

+1

あなたはShlemielの画家と友達ですか? –

+0

申し訳ありません私はCを新しくしましたか? lol – tubby

答えて

2

あなたはこれを使用することができます:

しばらく((TEMP = getchar関数())= EOF & & TEMP = '\ nの'!!)あなたが望むすべてがそうするならばfgetsを使用して検討することもでき

2

問題はここにある:次の文字が文字列の終わりを意味する「\ 0」であるという保証はありませんので

input[strlen(input)] = temp; 

は、これは簡単に、バッファオーバーフローにつながることができます。入力の終わりに境界チェックを追加する必要があります。それには余裕があり、temp '\ 0'の後に次の文字を作成する必要があります。

また、Tomによって提案されているように、あなたは間違いなくfgetsの使用を検討する必要があります。 (編集:残念ですが、私は読んで型を取得しましたが、私も考えていました)

+1

'gets()'のmanページは、それを使用しないことを強く推奨します。もし必要ならば、代わりに 'fgets()'を使用してください。 公式のテキストは次のとおりです。 *バグ gets()は使用しないでください。データを事前に知ることなく、gets()が読み込む文字が何であるかを知ることができないため、gets()はバッファの末尾を越えて文字を格納し続けるため、使用することは非常に危険です。これは、コンピュータのセキュリティを破るために使用されています。代わりにfgets()を使用してください。* – Bhaskar

関連する問題