変数に、文字列を入れた配列の文字列の最後の要素数を入れたいのですが(つまり'\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してもいいのですが、それはなんだか癪といいますか・・・。なぜこういうことがおきるのでしょうか?回答よろしくお願いします。
No.1ベストアンサー
- 回答日時:
>なぜこういうことがおきるのでしょうか
そのmoji[]の余計な部分にはどんなコードが入っているかは確認していますか?
リターンキーも「キー入力」の一つですよ。
moji[]をファイルに出力してバイナリエディタで見てみたのですが、ヌル文字の前に「0D 0A」というコードが入っていました。その部分をコピーしてテキストエディタに貼り付けしたらちゃんと改行されていました!2多くなる原因はリターンキーだったんですね。では変な意地(?)を張らずにcに-2することにしましょう。回答ありがとうございました!
No.3
- 回答日時:
>例えば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'
このことをじゅうぶん理解されていますか?
No.2
- 回答日時:
>例えば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多くなるはず・・・?
回答ありがとうございました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- Java Javaの問題なのですが、「3文字以上の英数字文字列を入力し、文字列の中に文字(9)が出てくるまでの 1 2023/06/06 18:55
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- Visual Basic(VBA) VBA シート上にドロップダウンリストを作り、予め指定値をセットしたいのですが 1 2023/03/25 15:15
- C言語・C++・C# 【C言語】全角文字の配列を、全角のまま1文字ずつ出力する方法 4 2023/05/09 15:08
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
%dなどの違い
-
TCL言語で文字列検索方法を教え...
-
プログラムによく出てくるst...
-
Cで二次元配列の読み込み
-
16進数を2文字ずつ配列に格納し...
-
VBA-DLLの引数受け渡しについて
-
C#でstringをポインタとして渡す
-
バイナリファイル中の日本語文...
-
シリアル通信で0x00を送信した...
-
sprintf関数での文字列変換につ...
-
#include <stdio.h> int main(v...
-
WSH(VBS)でJSONの文字列を読み...
-
AnsiStringについて
-
char型配列の最大要素数
-
構造体→文字列→構造体 をする方法
-
VB6.0でのバイナリデータの扱い...
-
C言語 配列の長さの上限
-
セグメントエラー
-
関数から配列を返すには?
-
Integer変数をカラにしたいので...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C++で入力した文字列から数字を...
-
nullと""、\\0とEOFの違いにつ...
-
プログラムによく出てくるst...
-
%dなどの違い
-
WSH(VBS)でJSONの文字列を読み...
-
TCL言語で文字列検索方法を教え...
-
C#でstringをポインタとして渡す
-
16進数を2文字ずつ配列に格納し...
-
_tcscpy_s(wcscpy_s)の第二引数...
-
C++で文字列の右端から特定の文...
-
シリアル通信で0x00を送信した...
-
VBA-DLLの引数受け渡しについて
-
数字の入った配列をファイルへ...
-
c#で他のアプリの文字入力フォ...
-
構造体→文字列→構造体 をする方法
-
Shift_JIS(16進)を文字に変換す...
-
バイナリファイル中の日本語文...
-
C言語の課題で困っています;
-
[C++]WCHARの1文字目しか表示で...
-
VB6.0でのバイナリデータの扱い...
おすすめ情報