• 締切済み

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

  • C言語 エラー表示 break の位置が誤っている(関数 main ) 

    #include<stdio.h> int main(void){ int n,i,j,k; char c='*'; printf("正の整数:"); scanf("%d",&n); if(n>0){ for(i=1;i<=n;i++){ printf("%d",i); for(j=1;j<=n+1-i;j++){ if(j==1){ if(i-1>0){ for(k=i-1;k>0;k--){ printf(" "); } } } printf("%c",c); } printf("\n"); } } break; return 0; } これをコンパイルすると「break の位置が誤っている(関数 main )」と表示されるのですが何でですか? 困ってます↓

  • C言語の問題-配列について

    今、独学でC言語をやっているんですが本にのっている問題に解答がなくわかりません。 問題はbunpu[tensu[i] / 10]++;はどういう意味を表すかです。 do-while分の繰り返しがおわった後にbumpuに++があるので+1をすればいいのでしょうか?よくわかりません・・・ 学生10人の点数の分布を10点ごとに分布グラフとして表示します。 #include <stdio.h> #define NUMBER 80 int main (void) { int i,j,num; int tensu[NUMBER]; int bunpu[11] = {0}; puts("点数を入力してください"); for("i =0; i < num; i++"){ printf("%2d番",i + 1); do{ scanf("%d",&tensu[i]); if(tensu[i] < 0 || tensu[i] > 100) printf("0以上100以下"); }while (tensu[i] < 0 || tensu[i] > 100); bunpu[tensu[i] / 10]++; } puts("\n 分布ぐらふ "); printf(" 100:"); for (j = 0;j < bumpu[10];j++) putchar('*') putchar('\n') for(i = 9; i>=0; i--) { printf("%3d - %3d:",i*10,i*10+9); for (j=0; j< bunpu[i];j++) putchar('*'); putchar('\n'); } return(o); }

  • c言語配列の問題について

    c言語配列の問題について 以下のプログラムは10個の数値を入力させ重複している文字を表示するプログラムですが match==i[k]でどの様に重複した数値を認識しているのかが解説不足で理解できません。 どの様に処理されているのか詳しく解説できる方がいましたらご教授願います。 #include <stdio.h> int main(void) { int i[10],j,k,match; printf("10個の数字を入力して下さい"); for(j=0;j<10;j++) scanf("%d",&i[j]); for(j=0;j<10;j++){ match=i[j]; for(k=j+1;k<10;k++) if(match==i[k]) printf("%dが重複しています\n",match); } return 0; }

  • C言語

    入力した文字列と文字列'x'を受け取り、'x'の位置のポインタを返すのですが、例えば、saxcvと入力すると、xcvと表示されるのですが、このソースだと、saxcvと全部表示されてしまいます。分からないので、教えてください。宜しくお願いします。 #include <stdio.h> char *a(char *sew) { char *p=sew; while (*sew != 'x') { sew++; } return(p); } int main(void) { char str[21] ={'\0'}; int i=0,no=0; char ch; printf("文字を入力してください:"); while (i<21) { ch=getchar(); if (ch=='\n') {break;} else if (ch != '\0' && ch != '\0') { str[i] =ch; i++; } } for(i=0; i<20; i++) { if(str[i]=='x') { printf("'x'以降は%sです。\n", a(str)); no=1; break; } } if (no==0) printf("'x'は見つかりませんでした。"); return (0); }

  • C言語のフローチャート

    昨日に引き続き失礼します。下記のプログラムを作成したのですがフローチャートは、どのように書けばいいのでしょうか? #include "stdafx.h" #include <stdio.h> int _tmain(int argc, _TCHAR* argv[]) { char ss[10] = "abcdefg"; char *ssp; ssp =ss; while (1){ if (*ssp ==0) break; printf("文字 *ssp=%c\n",*ssp); ++ssp;} int ary[10] = {1,2,3,4,5,6,7,8,9,10}; int *pt; pt = ary; while (1) { if (*pt == 10) break; printf("値 *pt=%d\n",*pt); ++pt;} return 0; }

  • C言語の2次配列

    4行5列の配列を用意し、その配列の要素をtij(i=1~4, j=1~5)とするとき、tij=i×j となるように配列に値を入れ、 それを表の形で画面に表示するプログラムを作りなさい。  という問題なんですが、自分は下の様に組みましたがうまく動きません。どこが悪いのか教えてください。よろしくお願いします。あまりC言語を理解していないので申し訳ないですが、なるべく簡単に教えて頂ければ幸いです。 #include<stdio.h> int main(void) { int i,j; int t[4][5]; for(i=0;i<=3;i++) { for(j=0;j<=4;j++) t=i*j; printf("%5d",t); printf("\n"); } return 0; }

  • c言語の難しい問題について

    (c言語の問題) 下記のプログラムを完成させ、キーボードから文字列を読み込み、-1文字ずらすことによって暗号化を行うプログラムを作りなさい。ただし、ピリオド、空白などはそのままにするようにすること。 例)this is a pen. sghr hr @ qdm. #include<stdio.h> #define CHAR_NUM 256 void angou( I ) { II } int main(void) { unsigned char text[CHAR_NUM]; char moji; int i; puts("暗号化する文字を入力しなさい。"); while((moji=getchar()) !=EOF){ text[i]=moji; i++; } angou(text i); printf("%s",text); return(0); } I、IIに入る文を書きなさい。 私はIには「char x[],int y」 IIには 「if('A'<x[i]<'Z' && 'a'<x[i]<'z') int j; for(j=0;j<y;j++) x[j]=x[j]-1 else」 といれたのですが、出力がうまくでません。どうすればいいのですか?

  • C言語の問題

    以下はC言語の問題です。お教えください。 1000以下の素数を求めるプログラム prog.c を作成せよ。各素数を整数4桁で出力し、15個の素数を出力した時点で改行処理 を行うこと。作成したプログラムを提出せよ。 です。 僕の考えでは、 #include <stdio.h> #include <math.h> main(){ int i; int j; int ix; int k; printf("正の整数を入力して下さい: "); scanf("%d",&i); ix=(int)(sqrt((double)i)); k=0; for(j=2;j<=ix;j++) { if(i%j==0) { k=1; } } if(k==0) { printf("%d は素数です\n",i); } else { printf("%d は素数ではありません\n",i); } となると思うのですが。どうやら違うようです。全然わからないので、正しい答えを教えてください。

  • C言語のソートの問題なんですが

    値を入力する→値を入力する度に昇順に表示する これを不の値を入力するまで続けるという プログラムを作ろうと思っているのですが #include<stdio.h> swap(int *a,int *b) { int t; t=*a; *a=*b; *b=t; } main() { int i,j,k,a[100]; for(i=0;;++i)  {   scanf("%d",&a[i]);   if(a[i] < 0)    break;   for(j=i+1;;++j)    if(a[i] > a[j])     swap(&a[i],&a[j]);   for(k=0;k <= i;++k)    printf("%d ",a[k]);  }  return 0; } のように書いたのですがjを使った繰り返しの部分でa[j]に 値が無いから動かないと思うのですが どのように直せばいいか分かりません どなたか分かる方御教授お願いします

  • C言語 シンプルソート

    C言語始めて1年の初心者です。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXSIZE 10000 void swapData(char *x, char *y); void simpleSort(char data[], int first, int last); int main(int argc, char *argv[]) { int data[MAXSIZE][300]; int i, j, count; FILE *fp; if(argc != 2) { fprintf(stderr, "Usage: %s <filename>\n", argv[0]); exit(0); } if ((fp = fopen(argv[1], "r")) == NULL) { fprintf(stderr, "File %s is not found.\n", argv[1]); exit(0); } for(i = 0; i < MAXSIZE; i++) { if (fscanf(fp,"%s", &data[i]) == EOF) break; } simpleSort(data[], 0, i - 1); for(j = 0; j < i; j++) printf("%s\n", data[j]); } void swapData(char *x, char *y){ char tmp[300]; strcpy(tmp, x); strcpy(x, y); strcpy(y, tmp); } void simpleSort(char data[], int first, int last) { int i, j; for(i = first; i < last; i++){ for(j = i+1; j <= last; j++){ if(strcmp(&data[i], &data[j]) > 0) swapData(&data[i], &data[j]); } } } 読み込んだ文字データをシンプルソートするプログラムなんですが、コンパイルできません。 simpleSortの部分がおかしいみたいなんですが、見直しても先入観からか間違いを見つけられません・・・・ どなたか間違いを指摘していただけたら助かります。