プロが教えるわが家の防犯対策術!

お忙しい中失礼します。
下記のプログラム内の動作について質問があります。宜しければご回答願います。

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;
}

A 回答 (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++);
}
    • good
    • 0
この回答へのお礼

丁寧な回答有難うございました。
#疑問系でコメントを書くなら書かない方が良いです。
#混乱のもとですから。。。→ハイ・・・
かなり助かりました。

お礼日時:2007/11/30 19:28

「文章的に正しいか」といわれると, 「日本語の文章としては (構文上) 間違っていないけど, 実際の動作の説明にはまったくなっていない」ということになるかなぁ. だいたい, 「エンターキー」って何?


あっさり答えだけ書いちゃうと「s2 から s1 に『文字列』をコピーする」です. どうしてそうなるかは, がんばって資料を探してください.

この回答への補足

回答有難うございます。
エンターキー→enterキー です。
「s2 から s1 に『文字列』をコピーする」→それはなんとなく分かるのですが・・・。
出来ましたら、「実際の動作の説明」を教えていただけないでしょうか?
お願いします・・・。

補足日時:2007/11/30 18:51
    • good
    • 0

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