- ベストアンサー
副プログラム内(void mystery(char s1[],char s2[]))の動作確認文
お忙しい中失礼します。 下記のプログラム内の動作について質問があります。宜しければご回答願います。 void mystery(char s1[],char s2[]) { int i=0; while(s2[i]!='\0'){ //s2[i]内に文字が入力され、エンターキーが入力されるまで{s1[i] = s2[i]; ++i;}内の動作を行う。 s1[i] = s2[i]; //s1[i] を基準にs2[i]の文字数を++iを使い、カウントする。 ++i; //++iはただs1[i] とs2[i]の文字が合致してるか確認を行う。s1[]=”Good”なら s2[]=”Good”の各文字が合致してるかどうか。 } s1[i] = '\0'; //s1[i]にエンターキーが入力されて、void mystery(char s1[],char s2[])内のループを抜ける。 return; //s1[i] = '\0'で'\0'が定義されているのでreturn 0;でない? } ↑上記動作質問://より右側の文章は文章的に正しいでしょうか? void mystery(char s1[],char s2[])内でどんな動作をしてるのかが、イマイチよく分からないのです。 ↓下記のプログラム #include <stdio.h> #include <stdlib.h> void mystery(char [], char[]); int main() { char m1[81],m2[81]; int i; printf("Message?"); gets(m1); mystery(m2,m1); puts(m2); system("PAUSE"); return 0; } void mystery(char s1[],char s2[]) { int i=0; while(s2[i]!='\0'){ s1[i] = s2[i]; ++i; } s1[i] = '\0'; return; }
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
うーん。。。 動作の説明としては全て間違いです。 >while(s2[i]!='\0'){ s2のi番目の要素が終端文字で無い間繰り返し処理します。 #エンターキー云々は関係ありません。 >s1[i] = s2[i]; s1のi番目の要素にs2のi番目の要素をコピーしています。 #比較ではなく代入です。 >++i; ここでのiは文字列の要素を表す要素番号に過ぎません。 #次の文字へ進むだけで、カウントなどしていません。 >s1[i] = '\0'; s2が文字列の終わりを検出したので、 ループを抜けてs1にも文字の終端を書き込んでいます。 #ここでは既にループを抜けた後です。 >return; 関数の戻り値はvoidつまり「無し」なので returnで評価される式も在りません。 #疑問系でコメントを書くなら書かない方が良いです。 #混乱のもとですから。。。 短くすると・・・:-p void mystery(char *s1, const char *s2){ while (*s1++ = *s2++); }
その他の回答 (1)
- Tacosan
- ベストアンサー率23% (3656/15482)
「文章的に正しいか」といわれると, 「日本語の文章としては (構文上) 間違っていないけど, 実際の動作の説明にはまったくなっていない」ということになるかなぁ. だいたい, 「エンターキー」って何? あっさり答えだけ書いちゃうと「s2 から s1 に『文字列』をコピーする」です. どうしてそうなるかは, がんばって資料を探してください.
補足
回答有難うございます。 エンターキー→enterキー です。 「s2 から s1 に『文字列』をコピーする」→それはなんとなく分かるのですが・・・。 出来ましたら、「実際の動作の説明」を教えていただけないでしょうか? お願いします・・・。
お礼
丁寧な回答有難うございました。 #疑問系でコメントを書くなら書かない方が良いです。 #混乱のもとですから。。。→ハイ・・・ かなり助かりました。