二次元配列の比較

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ZERO

二次元配列の比較

#1

投稿記事 by ZERO » 13年前

引数として、複数の文字列を格納した配列、その文字列数、ある文字列aを与え、
aが複数の文字列を格納した配列中に見つかれば1を返し、
見つからなければ0を返す関数find_string()を作れと言った問題を出されたのですが、
引数の設定方法が分かりません。どのように行えばいいのでしょうか?

non
記事: 1097
登録日時: 13年前

Re: 二次元配列の比較

#2

投稿記事 by non » 13年前

ポインタを習っていないのであれば
#define N 7
int find_string(char str[][N],int n,char a[]);
これでいいかな?

編集:7は、一番長い文字列の文字数の最大+1です。
non

ZERO

Re: 二次元配列の比較

#3

投稿記事 by ZERO » 13年前

すいません、一応ポインタは習っています。
出来ればポインタで作成したいと思って、何度かやってみたのですが自分では出来なかったので質問させてもらいました

ZERO

Re: 二次元配列の比較

#4

投稿記事 by ZERO » 13年前

コード:

#include<stdio.h>
int find_string(char *x,char *y,int n){
  int i;
  while(1){
    for(i=0;i<n;i++){
      if(strcmp(x[i],y)==0){
        return (1);
          }
      else
        return 0;
    }
  }
}
  main(){
    char *a[5]={"good","morning","sunny"},*b;
    int c=3,d;
    printf("Enter the word:");
    scanf("%s",b);
   d=find_string(a,b,c);
    printf("%d\n",c);
  }
ソースはこのような感じです
c:19:warning: passing argument 1 of ‘find_string’ from incompatible pointer type
実行してみるとこのエラーが出ます

ぬっち
記事: 105
登録日時: 13年前
連絡を取る:

Re: 二次元配列の比較

#5

投稿記事 by ぬっち » 13年前

まず、find_stringの第一引数はchar**型にするべきではないですか?
そして、示していただいたソースコードですと、strcmpに必要なヘッダファイルがないように見受けられます。
また、main関数の戻り値の型は書き忘れでしょうか?

私もこれらのことを直して実行してみましたが、scanfでアクセス違反が生じます。
char* bではなく、char b[ 60 ]とかにしたほうがよいと思います。
printfもcを表示ではなくdですよね?

ZERO

Re: 二次元配列の比較

#6

投稿記事 by ZERO » 13年前

基本的な事ばかり抜けてて申し訳ないです
指摘をもらった所を直して自分なりに手を加えた所、問題のように出来るようになりました。
最終的なコードは以下ですがこれで問題はないでしょうか?

コード:

#include<stdio.h>
#include<stdlib.h>
int find_string(char **x,char *y,int n){
  int i=0,flg=0;
  for(i=0;i<n;i++){
      if(strcmp(x[i],y)==0){
        return 1;
      }
      else if(strcmp(x[i],y)==1)
        return 0;
  }
}

int main(void){
    char *a[5]={"good","morning","sunny"},b[60];
    int c=3,d;
    printf("Enter the word:");
    scanf("%s",b);
    d=find_string(a,b,c);
    printf("%d\n",d);
  }

ぬっち
記事: 105
登録日時: 13年前
連絡を取る:

Re: 二次元配列の比較

#7

投稿記事 by ぬっち » 13年前

はい、私もそのような感じに訂正しました。
多分それで問題ないと思います^^

ところで、きちんと直したところについての理解は大丈夫ですか?

box
記事: 2002
登録日時: 13年前

Re: 二次元配列の比較

#8

投稿記事 by box » 13年前

strcmp()を使うんだったら、
stdlib.h
ではなくって
string.h
じゃないですか?

iの定義時に0で初期化している理由は何ですか?

flgは、定義しただけで使っていないようですが、
どういった存在意義がありますか?

strcmp()は、0、正の整数値(1とは限らない)、
それから、負の整数値(-1とは限らない)を返す場合があります。
負の整数値が返ってきたらどうしますか?

a[5]と定義した理由は何ですか?

cを3で初期化した理由は何ですか?

main()の戻り値がint型なのに、
呼び出し元に何も返していないのはなぜですか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

ぬっち
記事: 105
登録日時: 13年前
連絡を取る:

Re: 二次元配列の比較

#9

投稿記事 by ぬっち » 13年前

>boxさん

あ、本当ですね^^;
前のソースコードと比べてしまったため、else ifとなっていたりstdlib.hとなっていたりしたのは気がつきませんでした、申し訳ないm(--)m
c = 3は、ただ単に比較する文字列の数ではないですか?
私でしたら、関数の引数に直接値を代入してしまいますが。
a[ 5 ]は拡張することを考えている(?)のかな・・・。


>ZEROさん

動作することはしますが、boxさんの仰ったことも直しておいたほうがよいと思います。
むしろ、main関数の戻り値はコンパイル時に警告が出ると思うのですが^^;

ZERO

Re: 二次元配列の比較

#10

投稿記事 by ZERO » 13年前

>boxさん

>strcmp()を使うんだったら、
>stdlib.h
>ではなくって
>string.h
>じゃないですか?
私の環境では動きましたが、そちらの方が正しいようなので修正します。

>iの定義時に0で初期化している理由は何ですか?
私の理解力では説明がしづらいのですが文字列が0から始まるからです

>flgは、定義しただけで使っていないようですが、
>どういった存在意義がありますか?
試行錯誤していた時に使った物の消し忘れです。すいません。

>strcmp()は、0、正の整数値(1とは限らない)、
>それから、負の整数値(-1とは限らない)を返す場合があります。
>負の整数値が返ってきたらどうしますか?
考えていなかったので検討します。

>a[5]と定義した理由は何ですか?
3でよかったですね…すいません。

>cを3で初期化した理由は何ですか?
単語が3つだからです

>main()の戻り値がint型なのに、
>呼び出し元に何も返していないのはなぜですか?
修正しました。

>ぬっちさん
修正しました。申し訳ないです。
しかし自分の環境で動かしてからソースは貼っていますので、私の環境ではこのままで動きました。

ぬっち
記事: 105
登録日時: 13年前
連絡を取る:

Re: 二次元配列の比較

#11

投稿記事 by ぬっち » 13年前

ZERO さんが書きました:>iの定義時に0で初期化している理由は何ですか?
私の理解力では説明がしづらいのですが文字列が0から始まるからです
これは私の憶測でしかないのですが、boxさんが聞きたかったことというのは、なぜint i=0;としているのに、for文の第1項目でi=0と再び初期化する必要があるのかということではないでしょうか?
ZERO さんが書きました:>strcmp()は、0、正の整数値(1とは限らない)、
>それから、負の整数値(-1とは限らない)を返す場合があります。
>負の整数値が返ってきたらどうしますか?
考えていなかったので検討します。
これは最初に出していただいたソースコードで正しいと思います。
私もそのようにしました。
なぜ、修正したあとのソースコードでは、else if( strcmp( x[ i ], y ) == 1 )としてしまったのですか?
ただ単にelseでよいと思うのですが^^;

box
記事: 2002
登録日時: 13年前

Re: 二次元配列の比較

#12

投稿記事 by box » 13年前

ZERO さんが書きました:
>iの定義時に0で初期化している理由は何ですか?
私の理解力では説明がしづらいのですが文字列が0から始まるからです

直後のfor文で、また0で初期化していますね。定義時に0で初期化することは必要ですか?

>cを3で初期化した理由は何ですか?
単語が3つだからです

単語が2個だったらどうしますか?4個だったら?
そのたびにcの初期値も変えるのですか?
コンピューターに数えさせるのが楽ではありませんか?
例えば、
int c = sizeof(a) / sizeof(a[0]);
のように。
こうしておけば、aの要素数を変えれば、それに連動してcの値も変わります。
楽しましょうよ。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

ZERO

Re: 二次元配列の比較

#13

投稿記事 by ZERO » 13年前

ぬっち さんが書きました: これは私の憶測でしかないのですが、boxさんが聞きたかったことというのは、なぜint i=0;としているのに、for文の第1項目でi=0と再び初期化する必要があるのかということではないでしょうか

これは最初に出していただいたソースコードで正しいと思います。
私もそのようにしました。
なぜ、修正したあとのソースコードでは、else if( strcmp( x[ i ], y ) == 1 )としてしまったのですか?
ただ単にelseでよいと思うのですが^^;
そうですね…iの初期化する必要はありませんでした
自分もelseのみで良いと思ったのですが、elseのみだと"morning"か"sunny"を入力すると0が返ってしまったのでそうしました。
これは欠陥でしょうか?
box さんが書きました: 直後のfor文で、また0で初期化していますね。定義時に0で初期化することは必要ですか?
全くありませんでした。すいません。
box さんが書きました: 単語が2個だったらどうしますか?4個だったら?
そのたびにcの初期値も変えるのですか?
コンピューターに数えさせるのが楽ではありませんか?
例えば、
int c = sizeof(a) / sizeof(a[0]);
のように。
こうしておけば、aの要素数を変えれば、それに連動してcの値も変わります。
楽しましょうよ。
アドバイスありがとうございます。
参考にしてさらに修正してきます。

閉鎖

“C言語何でも質問掲示板” へ戻る