• ベストアンサー

プログラム(初心者)

文字列を入力し中に含まれる空白を削除した文字列を作るプログラムなのですが #include <stdio.h> #include <stdlib.h> int main(void){ char str[100]; int i,j,c; printf("文字列を入力してください\n"); gets(str); i=j=0; do{ c=str[i++]; if(c!= ' ') str[j++]=c; }while(c); printf("空白を削除した文字列は%sです\n",str); return EXIT_SUCCESS; } do文の所何やってるかさっぱりわかりません 教えてください

質問者が選んだベストアンサー

  • ベストアンサー
  • t4t
  • ベストアンサー率55% (47/84)
回答No.1

do{ c=str[i++]; // strから1文字取り出してcに入れる if(c!= ' ') // cが空白でなければ、 str[j++]=c; // strにcを入れる(空白をとばす) }while(c); // strが終わるまで繰り返す です。 もともとの文字列より空白を省いた文字列のほうが短いことを利用したプログラムですね。 str[i]が取り出す位置でstr[j]が文字を入れる位置です。jはiより小さいか、iと同じ値をとります。 " 1"(スペースと1)という文字列があったとき、(つまりstr[0]=' '、str[1]='1'、str[2]='\0') 初回のc=str[i++]で、cに空白が入り、iが一つ進み1になります。 ところがcは空白なので、str[j++]=c;は実行されません。jはそのままです。このときstr[0]=' '、str[1]='1'、str[2]='\0'のままです。 2回目のc=str[i++]で、cに'1'が入り、iが一つ進み2になります。。 cは空白ではないので、str[j++]=c;が実行されます。jはさっき加算されていませんから0のままです。 つまり、このときstr[0]='1'、str[1]='1'、str[2]='\0'となって、jが1に加算されます。 3回目のc=str[i++]で、cに'\0'が入り、iが一つ進みます。 cは空白ではないので、str[j++]=c;が実行されません。jはさっき加算されていますから1です。 つまり、このときstr[0]='1'、str[1]='\0'、str[2]='\0'となって、jが2に加算されます。 ここでcが'\0'つまり0なので、while(c)を抜けます。 その下のprintfの"%s"では、strの'\0'の直前までしか編集されませんから、表示される文字列はstr[0]の'1'のみになります。

minaraiH
質問者

お礼

わかりました。ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • php504
  • ベストアンサー率42% (926/2160)
回答No.4

文字列を "a b" とします str[ 0 ] : 'a' str[ 1 ] : ' ' str[ 2 ] : 'b' str[ 3 ] : 0 になりますね doループの最初は c = str[ 0 ]; // cにstr[ 0 ] ('a')が代入 i++されてi は 1 if ( c != ' ' ) // c('a')は' 'ではないので str[ 0 ] = c; // str[ 0 ] に c ('a')が代入 j++されてj は 1 2回目 c = str[ 1 ]; // cにstr[ 1 ] (' ')が代入 i++されてi は 2 if ( c != ' ' ) // c(' ')は' 'と一致 str[ j++ ] = c; // この行は実行されない j は 1 のまま 3回目 c = str[ 2 ]; // cにstr[ 2 ] ('b')が代入 i++されてi は 3 if ( c != ' ' ) // c('b')は' 'ではないので str[ 1 ] = c; // str[ 1 ] に c ('b')が代入 j++されてj は 2 4回目 c = str[ 3 ]; // cにstr[ 3 ] (0)が代入 i++されてi は 4 if ( c != ' ' ) // c(0)は' 'ではないので str[ 2 ] = c; // str[ 2 ] に c (0)が代入 j++されてj は 3 c が 0 なのでdoループ終了 結果 str[ 0 ] : 'a' str[ 1 ] : 'b' str[ 2 ] : 0 で空白が削除されました

minaraiH
質問者

お礼

わかりました。ありがとうございました。

すると、全ての回答が全文表示されます。
  • kouji_124
  • ベストアンサー率46% (283/605)
回答No.3

do文が何をやっているかわからないって、答えはご自分で書かれていますよね。 >文字列を入力し中に含まれる空白を削除した文字列を作るプログラム そうです。 doの部分で空白を削除しています。 細かく説明すれば。 >i=j=0; 整数変数の初期化 >do{ ループの開始 >c=str[i++]; 文字列変数「str」の先頭から「i番目」の1文字抽出 >if(c!= ' ') >str[j++]=c; 空白であるか判定 空白だった場合は、文字列変数「str」の「j番目」に書き戻し >}while(c); 文字列変数「str」の先頭から「i番目」の文字がNULL(0x00h)だった場合ループ終了

minaraiH
質問者

お礼

わかりました。ありがとうございました。

すると、全ての回答が全文表示されます。
回答No.2

落ち着いて分解してみましょう。 c=str[i++]; ↓ c=str[i]; i++; do{  c=str[i];  i++;  if(c!= ' ')  {   str[j]=c;   j++;  } }while(c); if 分の } のあとに printf で str、i、j を表示すると分かりやすいですよ。 動作は単純で、スペースがでなければ次の文字を入れていくものです。

minaraiH
質問者

お礼

わかりました。ありがとうございました。

すると、全ての回答が全文表示されます。
このQ&Aのポイント
  • 数日前から、無線APとして使用していたWRC-1750GHBK(2.4Gと5G併用タイプ)の5Gのパスワードが違うため、家族一斉に同時期に接続できなくなりました。
  • IPアドレスから管理画面へのアクセスも試みましたが、「ページを開けません。サーバーが応答を停止しています」とエラーが表示されます。
  • 原因として考えられるのは、5Gのパスワードが誤って変更された可能性や、ルーター自体の故障が考えられます。
回答を見る

専門家に質問してみよう