アプリ版:「スタンプのみでお礼する」機能のリリースについて

変数に、文字列を入れた配列の文字列の最後の要素数を入れたいのですが(つまり'\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してもいいのですが、それはなんだか癪といいますか・・・。なぜこういうことがおきるのでしょうか?回答よろしくお願いします。

A 回答 (3件)

>なぜこういうことがおきるのでしょうか


そのmoji[]の余計な部分にはどんなコードが入っているかは確認していますか?
リターンキーも「キー入力」の一つですよ。
    • good
    • 0
この回答へのお礼

moji[]をファイルに出力してバイナリエディタで見てみたのですが、ヌル文字の前に「0D 0A」というコードが入っていました。その部分をコピーしてテキストエディタに貼り付けしたらちゃんと改行されていました!2多くなる原因はリターンキーだったんですね。では変な意地(?)を張らずにcに-2することにしましょう。回答ありがとうございました!

お礼日時:2009/07/23 10:40

>例えば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'

このことをじゅうぶん理解されていますか?
    • good
    • 0
この回答へのお礼

1バイト文字の間違いでした。改行が入るんですね。
改行は1バイトなんですね。謎が解けました。
回答ありがとうございました。

お礼日時:2009/07/23 11:00

>例えば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になっていなければおかしいですよね。

この回答への補足

さっきのお礼の続きなのですが、リターンキーで入力される改行は1バイトということでした。

補足日時:2009/07/23 11:00
    • good
    • 0
この回答へのお礼

確かにそうですね。ではscanf使うとヌル文字の前に余分なコードは入らないんですね(確かめてみてもそうでした)。あれ?だとするとfgetsを使うとリターンキーの分(2バイトでした)も入って+3多くなるはず・・・?
回答ありがとうございました!

お礼日時:2009/07/23 10:54

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!