- ベストアンサー
ソースコードの間違い (C言語)
変数に、文字列を入れた配列の文字列の最後の要素数を入れたいのですが(つまり'\0')、うまくいきません。いつも2個多い値になってしまいます。 #include <stdio.h> void main() { char moji[100]={0}; int c=0; fgets(moji,sizeof moji,stdin); while( moji[c] != '\0' ) ++c; printf("\n%d\n",c); // } 例えば5文字の1ビット文字を入れると、最後の文字はmoji[4]にあるのでprintfで4と表示されるはずじゃないですか。でも6になるんです。いつも+2の値になるんですよ。どうやらfgetsを使っているからそうなるらしく、scanfを使うと結果は1多い値に、普通に配列に直接文字列を代入すると正常な結果になります。別にcに-2してもいいのですが、それはなんだか癪といいますか・・・。なぜこういうことがおきるのでしょうか?回答よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>なぜこういうことがおきるのでしょうか そのmoji[]の余計な部分にはどんなコードが入っているかは確認していますか? リターンキーも「キー入力」の一つですよ。
その他の回答 (2)
- asuncion
- ベストアンサー率33% (2127/6289)
>例えば5文字の1ビット文字を入れると 5文字の1ビット文字というのは、具体的にどういったものでしょうか? 5文字の、0または1から構成する文字列、ということでしょうか? 仮にそういうことだとして、"10101" と入力したとします。 今回はfgets関数を使っていますので、"10101"と入力したとき、 配列moji[]には下記のデータが入ります。 moji[0]:'1' moji[1]:'0' moji[2]:'1' moji[3]:'0' moji[4]:'1' moji[5]:'\n' moji[6]:'\0' このことをじゅうぶん理解されていますか?
お礼
1バイト文字の間違いでした。改行が入るんですね。 改行は1バイトなんですね。謎が解けました。 回答ありがとうございました。
>例えば5文字の1ビット文字を入れると、最後の文字はmoji[4]にあるのでprintfで4と表示されるはずじゃないですか。 なんでですか? >while( moji[c] != '\0' ) ++c; で、5文字めの検査はこうですよね。 moji[4] != '\0' → c = 4 + 1 = 5 で、6文字めを検査した時に moji[5] == '\0' でwhileループを抜けますから、moji[]に5文字が入っていればcの値は5になっていなければおかしいですよね。
お礼
確かにそうですね。ではscanf使うとヌル文字の前に余分なコードは入らないんですね(確かめてみてもそうでした)。あれ?だとするとfgetsを使うとリターンキーの分(2バイトでした)も入って+3多くなるはず・・・? 回答ありがとうございました!
補足
さっきのお礼の続きなのですが、リターンキーで入力される改行は1バイトということでした。
お礼
moji[]をファイルに出力してバイナリエディタで見てみたのですが、ヌル文字の前に「0D 0A」というコードが入っていました。その部分をコピーしてテキストエディタに貼り付けしたらちゃんと改行されていました!2多くなる原因はリターンキーだったんですね。では変な意地(?)を張らずにcに-2することにしましょう。回答ありがとうございました!