重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

次のプログラムの変数の説明と処理の流れを素人でも理解できるように説明してもらえないでしょうか。

#include <stdio.h>
#define MAX 128

int str_comp(char nx[], char ny[]){
int i, j, k=0;
for(i=0; i<=MAX; i++){
if( nx[i]=='\0' ){
return 0;
}
else if( nx[i]==ny[0] ){
for( j=0; nx[i]==ny[j]; j++ ){
i++;
}
if( ny[j]=='\0' ){
return 1;
}
}
}
}

int main(void)
{
char namex[MAX};
char namey[MAX};
int n;
int i;

printf("文字列x(64文字まで)? ");
scanf("%s",namex);
printf("文字列y(64文字まで)? ");
scanf("%s",namey);

n=str_comp(namex,namey);

if(n==1){
printf("'%s'に'%s'は含まれます\n",namex,namey);
}
else if(n==0){
printf("'%s'に'%s'は含まれません\n",namex,namey);
}

return 0;
}


実効結果
文字列x(64文字まで)? Katatsumuri 
文字列y(64文字まで)? ta
'Katatsumuri'に'ta'は含まれます.

エラーは出ないはずです。
よろしくお願いします。

A 回答 (4件)

んじゃ、取りあえず書きます。



<関数 str_comp()>
 仮引数
  char nx[] 最初に入力された文字列
  char ny[] 2番めに入力された文字列
 戻り値
  0=nx[]にny[]が含まれない 1=nx[]にny[]が含まれる
 変数
  int i カウンタ変数(nx[]の配列の添え字)
  int j カウンタ変数(ny[]の配列の添え字)
  int k=0 ←これ、使用されていません
 処理
  iを0からi<=MAXまで1ずつ増やしながら下記を実行
   もしnx[i]=='\0'だったら ←nx[i]はnx[]のi+1番目の文字。'\0'はNull文字。つまり、入力された文字の最後の文字の次まで来たら
    戻り値=0で戻る ←ここまで調べたということは、最後まで調べ終わったのにnx[]の中にny[]がないということなので

   nx[i]=='\0'以外でnx[i]==ny[0]だったら ←nx[]のi+1番目の文字とny[]の最初の文字が一致
    jをゼロから始めてnx[i]==ny[j]が成り立つ間、iとjを1ずつ増やす ←nx[]のi+1文字めとny[]のj+1文字めが一致する一番最後の次までiとjを進める
    もしny[j]=='\0'だったら ←jを進めた結果ny[]の最後の文字までnx[]と一致していたとしたら、つまり、nx[]の中にny[]が含まれていたら
     戻り値=1で戻る

<関数 main()>
 変数
  char namex[MAX] 最初に入力する文字列を格納
  char namey[MAX] 2番めに入力する文字列を格納
  int n      関数 str_comp()の戻り値
  int i      ←これ、使用されていません
 処理
  「文字列x(64文字まで)?」を出力
  namexに最初の文字列を読み込み
  「文字列x(64文字まで)?」を出力
  nameyに2番めの文字列を読み込み

  関数 str_comp()にnamexとnameyの値を渡し、結果を戻り値nに受け取る

  nが1だったら
   「namexにnameyは含まれます」と出力
  nが0だったら
   「namexにnameyは含まれません」と出力

以上。…わかります?(笑)
    • good
    • 0
この回答へのお礼

有難うございます。
時間かけて理解してみます・・・

お礼日時:2009/07/02 21:27

変数namexとnameyの宣言の閉じ括弧が…というのはご愛嬌として、


このプログラムに
文字列x(64文字まで)? ABABCD
文字列y(64文字まで)? ABC
という入力を与えると、
'ABABCD'に'ABC'は含まれません
という結果になると思うのですが、これはおそらく、意図した挙動と異なりますよね。

この回答への補足

なんか 学校ではOSのLinuxでちゃんと作動したのに
家でVine Linuxでしたらエラー出まくってしまいました・・・

補足日時:2009/07/02 20:24
    • good
    • 0

いや、実は処理の流れを説明するのが結構厄介なんですよ。

しかも、バグってるんで、単にこのプログラムの通りに説明していいものかどうかもわからないし…。

自分で書いたプログラムなら、変数の説明と処理の流れはわかっているはずですよね。それとも、単に写しただけなんでしょうか? 教科書に載っていたプログラムの意味が知りたい? そういうことなら教科書にダメだししても仕方ないのでプログラム通りに説明しますけど。

実は自分が書いたプログラムで、答え合わせのために流れを書いて欲しいということなら、書くの大変なんでまずは質問者さんがどういう流れのつもりで書いたのかを書いて欲しいんですけどね。

この回答への補足

なんて言うか・・・
全然理解してないんで 流れとか把握してないです・・・

なんでプログラム通りに説明していただければいいんですが

補足日時:2009/07/02 20:04
    • good
    • 0

どこがわかりませんか? 全くわからないというわけでもないですよね。

ゼロから説明しようとするとどこまで詳しく書いたらいいのかわからないので、わかる範囲を書いてみてください。

あと、質問の趣旨は何ですか? …というのは、読んでいてこのプログラムが何をしたいのかは理解したのですが、実行時にある値を入力すると暴走する恐れがあるバグが含まれているんです。

この回答への補足

正直教科書を見ながらやったんで、ほとんど理解できてません。

たとえば
char namex[MAX}; :キーボードから入力された文字が格納される
みたいに簡単に説明してもらえればいいんですが・・・

趣旨と言われましても変数の説明と処理の流れを説明してもらいたいってことです。

補足日時:2009/07/02 19:24
    • good
    • 0

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