
次のプログラムの変数の説明と処理の流れを素人でも理解できるように説明してもらえないでしょうか。
#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'は含まれます.
エラーは出ないはずです。
よろしくお願いします。

No.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は含まれません」と出力
以上。…わかります?(笑)
No.3
- 回答日時:
変数namexとnameyの宣言の閉じ括弧が…というのはご愛嬌として、
このプログラムに
文字列x(64文字まで)? ABABCD
文字列y(64文字まで)? ABC
という入力を与えると、
'ABABCD'に'ABC'は含まれません
という結果になると思うのですが、これはおそらく、意図した挙動と異なりますよね。

No.2
- 回答日時:
いや、実は処理の流れを説明するのが結構厄介なんですよ。
しかも、バグってるんで、単にこのプログラムの通りに説明していいものかどうかもわからないし…。自分で書いたプログラムなら、変数の説明と処理の流れはわかっているはずですよね。それとも、単に写しただけなんでしょうか? 教科書に載っていたプログラムの意味が知りたい? そういうことなら教科書にダメだししても仕方ないのでプログラム通りに説明しますけど。
実は自分が書いたプログラムで、答え合わせのために流れを書いて欲しいということなら、書くの大変なんでまずは質問者さんがどういう流れのつもりで書いたのかを書いて欲しいんですけどね。
この回答への補足
なんて言うか・・・
全然理解してないんで 流れとか把握してないです・・・
なんでプログラム通りに説明していただければいいんですが

No.1
- 回答日時:
どこがわかりませんか? 全くわからないというわけでもないですよね。
ゼロから説明しようとするとどこまで詳しく書いたらいいのかわからないので、わかる範囲を書いてみてください。あと、質問の趣旨は何ですか? …というのは、読んでいてこのプログラムが何をしたいのかは理解したのですが、実行時にある値を入力すると暴走する恐れがあるバグが含まれているんです。
この回答への補足
正直教科書を見ながらやったんで、ほとんど理解できてません。
たとえば
char namex[MAX}; :キーボードから入力された文字が格納される
みたいに簡単に説明してもらえればいいんですが・・・
趣旨と言われましても変数の説明と処理の流れを説明してもらいたいってことです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
セグメントエラー
-
”123456”といった整数を文字列...
-
C言語について
-
プログラミング 文字入力のエラ...
-
C言語のステップ数をカウントす...
-
sscanfとscanfの違いがよくわか...
-
VBで全角文字の上位コードを...
-
C言語の初心者です。これを実行...
-
至急お願いします
-
cプログラミングについて
-
C言語 空白の行(改行のみ)が...
-
C言語 strlen 再入力を促す
-
文字列から数字への変換
-
Cプログラムでの標準入力から...
-
switchの使い方を教えてください。
-
文字列の問題
-
プログラムのことで
-
文字列を特定の全角文字で区切...
-
メニューバーでクリックした個...
-
C++でランレングス符号化のプロ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CStringのFindで文字列検索を行...
-
fgetsで拾われる改行文字を削除...
-
sscanfとscanfの違いがよくわか...
-
反転した数値を表示させるやり方
-
charと%c , %s の関係について
-
fgets関数を使用したときの文字...
-
Cで「大文字、小文字の判定」は...
-
strstrを利用しない文字列検索...
-
文字列中に含まれる文字の個数...
-
C言語のステップ数をカウントす...
-
itoaわかりません
-
C++
-
C/C++言語で日本語処理
-
C言語 空白の行(改行のみ)が...
-
CStringについて
-
小文字のみを数える方法
-
教えていただけませんか?C言語...
-
ブランクのチェック
-
str[j++]の意味
-
初歩的なプログラムなんですが...
おすすめ情報