10秒目をつむったら…

今回のC言語の質問は以下の内容です>< 解説おねがいします

実行結果↓

ABC△DEF△△XYZ
DEF△△XYZ
XYZ

△は空白です><

友達に以下のプログラムを教えてもらったのですがJの意味が分かりません・・・
J=0やJ=1は何を表しているのでしょうか?
また、else if(!J)の意味もちょっと・・・


#include<stdio.h>
void main(void)
{
char m[]=" ABC DEF XYZ";
int i,j;
for(i=0;m[i]!='\0';i++)
{
if(m[i]==32)
{
j=0;
}
else if(!j)
{
printf("%s\n",&m[i]);
j=1;
}
}
m[i]='\0';
fflush(stdin);
getchar();
return ;
}



解説してくれる方よろしくお願いいたします><

A 回答 (5件)

Jはスペース文字出現でのフラグの役目です、Booleanの方が見やすいかも。



動作については…
 文字列を先頭から見て行って
   スペース文字なら、Jフラグを寝かす。
   スペース文字じゃなくて、かつ、Jフラグが寝ていれば、以降を表示する。
と言う意味のプログラムの様ですね。

一つ言うと、Jの初期化宣言が抜けてますので、アルゴリズムの説明用なら記載有った方が良いと思います。
 宣言時に int j= 1; と書くか。
 for文時に i=j=0; とでも書いて置きましょう。
まぁ、_mainで0クリアしてるから大丈夫とか考えられるようなら読み捨てて下さい。
    • good
    • 0

 これは空白があったら空白じゃない次の文字から先を出力するという内容だから、j はその制御に使われています。



 m[i]==32 というのが空白かどうかを調べてる部分なので、
 調べる文字が空白だったらjを0にし、それ以外の時にjが0だったら、その文字以降を出力し、jに1を立てて、その次の回には出力が行われないようにしています。

> else if(!J)
 
 C言語の場合、真偽の判定は0が偽、それ以外を真としています。この判定ではjの否定をとってるので真偽の判定は逆になります、つまり、jが0なら真になって次の処理が実行されます。
    • good
    • 0

>J=0やJ=1は何を表しているのでしょうか?



空白が見つかったときとそうでないときの処理を区別するために使っています。
なお、jという変数名が適切であるかどうかはわかりません。

>else if(!J)の意味

else if (j == 0)
と同じ意味です。

ところで、そのお友達のC言語に関する技量はそれほど高くない(理由は後述)ので、
あまり参考にしない方がいいと思います。もちろん、人間としての度量とは全く別の話です。

【理由】
1)main関数の戻り値の型は、組み込みプログラムなどの例外を除いて、一般にはint型です。
2)32という即値を使っているため、そこの処理が何をしているか、わかりづらくなっています。
  しかも、ASCIIコード体系でしか使えなくなってしまっています。
  どうせなら、
  if (m[i] == ' ')
  とでも書く方がよほどわかりやすいでしょう。
3)m[i]='\0';
  の後でm[]にアクセスしていませんので、この文の存在価値はありません。
4)fflush(stdin);
  は、未定義の動作を引き起こします。標準入力をfflushしてはいけません。
    • good
    • 0

教えてくれた友達に尋ねれば済むことをなぜにこの場で?

    • good
    • 0

jは、文字列中で空白検出を意味しています。


jが0の場合、空白を見つけたので、空白以降の文字列を出力。
jが1の場合は、次の要素を参照。文字列の出力を行わない。

else if(!j)とelse if(j==0)は、同じ意味です。

if(m[i]==32) <-- 空白と等しいか?
{
j=0;   <-- 空白の箇所を検出したら0。
}
else if(j==0) <-- 空白の箇所したか?
{
printf("%s\n",&m[i]);
j=1; <-- 空白未検出に戻す。
}

jの初期化が抜けてるけどね・・・
    • good
    • 0

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