• 締切済み

C言語の配列を利用した問題が分からないんです

学校でC言語を習っているのですが、配列を利用した問題が解けません。 問題は「一致する文字列が、最初に出てくる位置を求める」というもので、穴埋め問題なのですが、どんなに考えても分かりません。 しかも、答えは教えないので自分で調べましょうと言われて困っています。 誰か分かる方、教えて下さい。 (抜かれているところをどう表現していいか分からなかったので、★マークにしています。分かりにくくてスミマセン) --------------------問題----------------------- #include<stdio.h> int main() {   char a[]="abcdefg";   char b[]="cde";   int i,j;   for(i=0; i<★; i++){     if( ★ ){       for(j=1; j<★; j++){         if(  ★  ){            break;         }       }       if(  ★  ){         break /*一致*/       }     }   }   printf("%d\n",i);   return 0; } ---------------------------------------------- 上の実行結果は、「2」と表示されるとの事でした。 どこか1つでもいいので、よろしくお願いします。

みんなの回答

  • dtm
  • ベストアンサー率37% (23/62)
回答No.12

まだ間違ってるワナ・・・・ for (j=1; j < (sizeof b) / (sizeof b[0]); j++) ではなく for (j = 1; j < (sizeof b) / (sizeof b[0]) - 1; j++) No.4 で指摘した時は i < 5 と j < 3 ってわかってたのに・・・・ 結局まともに答えを書いた No.1,3,5 全員間違い?? 俺も No.4,7 では正しいことを書いているが、No.9,11 で間違いだし・・・・。 悲しい・・・

すると、全ての回答が全文表示されます。
  • dtm
  • ベストアンサー率37% (23/62)
回答No.11

久しぶりに見てみると間違ってたりして・・・・ こっそり訂正しておこう。 sizeof(a) == 8, sizeof(b) == 4 だわな・・・・ ただ、sizeof(a) == 8 と決め打ちするのは微妙に危険だわさ。 正確には (sizeof a) / (sizeof a[0])。 というわけで、 int main() {   char a[] = "abcdefg";   char b[] = "cde";   int i, j;   for (i = 0; i < (sizeof a) / (sizeof a[0]) - (sizeof b) / (sizeof b[0]) + 1; i++) {     if (a[i] == b[0]) {       for (j=1; j < (sizeof b) / (sizeof b[0]); j++)         if (a[i + j] != b[j])            break;       if (!b[j])         break /*一致*/     }   }   printf("%d\n", i);   return 0; }

すると、全ての回答が全文表示されます。
  • nagare
  • ベストアンサー率33% (280/831)
回答No.10

dtmさん了解です(ありがとうございます) データが固定だったのでガチガチにしています 条件として、「aデータ長はbデータ長+1以上」 データが可変であれば、当然問題ありありです ということで

すると、全ての回答が全文表示されます。
  • dtm
  • ベストアンサー率37% (23/62)
回答No.9

そうではなくて、sizeof(a) == 7, sizeof(b) == 3 ですので、sizeof(a) - sizeof(b) + 1 で i は5になります。一致しなかった場合は5が表示されます。 b[j] が NULL まで j に加算するのはいいのですが、a[i] が NULL になるまでループさせた場合は結局 i < 7 と同じになりますので、a[i + j] で配列を超えてしまいます。j のループ条件に && i + j < sizeof(a) を加えればエラーは回避できますが、2周何もしない無駄なループが出来てしまいます。 関数を作るとこんな感じでしょうか(動くのか??) int func(char* a, char* b) {   int i;   char* p;   if (!b[0]) return -1;   for (p = a; *p ; p++) {     for (i = 0; p[i] && b[i] && p[i] == b[i]; i++)       ;     if (!b[i]) return p - a;     if (!p[i]) return -1;   }   return -1; }

すると、全ての回答が全文表示されます。
  • nagare
  • ベストアンサー率33% (280/831)
回答No.8

訂正 7->6,4->3 strcmp->strstr ごめんなさい 問題に対しては不正解ですが、参考まで for(i=0; '\0'!=a[i]; i++) for(j=1; '\0'!=b[j]; j++)

すると、全ての回答が全文表示されます。
  • dtm
  • ベストアンサー率37% (23/62)
回答No.7

>データが固定だったんで、for分も固定値にしてしまいました (^^; いえ、定数を使ったのが間違いというのではなく、i < 8, j < 4 だと NULL まで読んでしまうことに加え、a[i + j] で配列の外まで読んでしまう事です。 a[i + j] を考慮して i の for 文を書かせたかった問題なのでしょうが、a[] や b[] が実行前にわかっているプログラムだとしても、あまりにもお粗末な無駄の多い問題ですね。もっとシンプルに書くべきです。

すると、全ての回答が全文表示されます。
  • nagare
  • ベストアンサー率33% (280/831)
回答No.6

言い訳 データが固定だったんで、for分も固定値にしてしまいました (^^; (パラメタにしないかい? 普通) 余談 strcmpを逆アセンブルすれば、本当の正解が・・・・

すると、全ての回答が全文表示されます。
noname#30727
noname#30727
回答No.5

★1 sizeof(a) - sizeof(b) + 1 ★2 a[i] == b[0] ★3 sizeof(b) ★4 b[j] != a[i + j] ★5 j == sizeof(b) 一致しなかった場合が考慮されていないのがイマイチな問題ですね。

すると、全ての回答が全文表示されます。
  • dtm
  • ベストアンサー率37% (23/62)
回答No.4

No.1 や No.3 のプログラムを学校にもっていくと不正解になっちゃうぞ!! for 文の8と4の数字以外は No.3 のプログラムで OK。 なぜだかよく考えてみよう。 ほかは、j の数字を少し変えるだけで if (a[i] == b[0]) の文が不要になることかな。これも簡単なので考えてみてください。 (こんないいかげんな問題を作ったのは先生ですか?)

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

ごめんなさい TABを直しました #include<stdio.h> int main() {   char a[]="abcdefg";   char b[]="cde";   int i,j;   for(i=0; i<8; i++){     if( a[i]==b[0] ){       for(j=1; j<4; j++){         if( a[i+j]!=b[j]) ){            break;         }       }       if('\0'==b[j]){         break /*一致*/       }     }   }   printf("%d\n",i);   return 0; }

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

関連するQ&A