二次元配列の比較
Re: 二次元配列の比較
ポインタを習っていないのであれば
#define N 7
int find_string(char str[][N],int n,char a[]);
これでいいかな?
編集:7は、一番長い文字列の文字数の最大+1です。
#define N 7
int find_string(char str[][N],int n,char a[]);
これでいいかな?
編集:7は、一番長い文字列の文字数の最大+1です。
non
Re: 二次元配列の比較
すいません、一応ポインタは習っています。
出来ればポインタで作成したいと思って、何度かやってみたのですが自分では出来なかったので質問させてもらいました
出来ればポインタで作成したいと思って、何度かやってみたのですが自分では出来なかったので質問させてもらいました
Re: 二次元配列の比較
#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
実行してみるとこのエラーが出ます
Re: 二次元配列の比較
まず、find_stringの第一引数はchar**型にするべきではないですか?
そして、示していただいたソースコードですと、strcmpに必要なヘッダファイルがないように見受けられます。
また、main関数の戻り値の型は書き忘れでしょうか?
私もこれらのことを直して実行してみましたが、scanfでアクセス違反が生じます。
char* bではなく、char b[ 60 ]とかにしたほうがよいと思います。
printfもcを表示ではなくdですよね?
そして、示していただいたソースコードですと、strcmpに必要なヘッダファイルがないように見受けられます。
また、main関数の戻り値の型は書き忘れでしょうか?
私もこれらのことを直して実行してみましたが、scanfでアクセス違反が生じます。
char* bではなく、char b[ 60 ]とかにしたほうがよいと思います。
printfもcを表示ではなくdですよね?
Re: 二次元配列の比較
基本的な事ばかり抜けてて申し訳ないです
指摘をもらった所を直して自分なりに手を加えた所、問題のように出来るようになりました。
最終的なコードは以下ですがこれで問題はないでしょうか?
指摘をもらった所を直して自分なりに手を加えた所、問題のように出来るようになりました。
最終的なコードは以下ですがこれで問題はないでしょうか?
#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);
}
Re: 二次元配列の比較
はい、私もそのような感じに訂正しました。
多分それで問題ないと思います^^
ところで、きちんと直したところについての理解は大丈夫ですか?
多分それで問題ないと思います^^
ところで、きちんと直したところについての理解は大丈夫ですか?
Re: 二次元配列の比較
strcmp()を使うんだったら、
stdlib.h
ではなくって
string.h
じゃないですか?
iの定義時に0で初期化している理由は何ですか?
flgは、定義しただけで使っていないようですが、
どういった存在意義がありますか?
strcmp()は、0、正の整数値(1とは限らない)、
それから、負の整数値(-1とは限らない)を返す場合があります。
負の整数値が返ってきたらどうしますか?
a[5]と定義した理由は何ですか?
cを3で初期化した理由は何ですか?
main()の戻り値がint型なのに、
呼び出し元に何も返していないのはなぜですか?
stdlib.h
ではなくって
string.h
じゃないですか?
iの定義時に0で初期化している理由は何ですか?
flgは、定義しただけで使っていないようですが、
どういった存在意義がありますか?
strcmp()は、0、正の整数値(1とは限らない)、
それから、負の整数値(-1とは限らない)を返す場合があります。
負の整数値が返ってきたらどうしますか?
a[5]と定義した理由は何ですか?
cを3で初期化した理由は何ですか?
main()の戻り値がint型なのに、
呼び出し元に何も返していないのはなぜですか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: 二次元配列の比較
>boxさん
あ、本当ですね^^;
前のソースコードと比べてしまったため、else ifとなっていたりstdlib.hとなっていたりしたのは気がつきませんでした、申し訳ないm(--)m
c = 3は、ただ単に比較する文字列の数ではないですか?
私でしたら、関数の引数に直接値を代入してしまいますが。
a[ 5 ]は拡張することを考えている(?)のかな・・・。
>ZEROさん
動作することはしますが、boxさんの仰ったことも直しておいたほうがよいと思います。
むしろ、main関数の戻り値はコンパイル時に警告が出ると思うのですが^^;
あ、本当ですね^^;
前のソースコードと比べてしまったため、else ifとなっていたりstdlib.hとなっていたりしたのは気がつきませんでした、申し訳ないm(--)m
c = 3は、ただ単に比較する文字列の数ではないですか?
私でしたら、関数の引数に直接値を代入してしまいますが。
a[ 5 ]は拡張することを考えている(?)のかな・・・。
>ZEROさん
動作することはしますが、boxさんの仰ったことも直しておいたほうがよいと思います。
むしろ、main関数の戻り値はコンパイル時に警告が出ると思うのですが^^;
Re: 二次元配列の比較
>boxさん
>strcmp()を使うんだったら、
>stdlib.h
>ではなくって
>string.h
>じゃないですか?
私の環境では動きましたが、そちらの方が正しいようなので修正します。
>iの定義時に0で初期化している理由は何ですか?
私の理解力では説明がしづらいのですが文字列が0から始まるからです
>flgは、定義しただけで使っていないようですが、
>どういった存在意義がありますか?
試行錯誤していた時に使った物の消し忘れです。すいません。
>strcmp()は、0、正の整数値(1とは限らない)、
>それから、負の整数値(-1とは限らない)を返す場合があります。
>負の整数値が返ってきたらどうしますか?
考えていなかったので検討します。
>a[5]と定義した理由は何ですか?
3でよかったですね…すいません。
>cを3で初期化した理由は何ですか?
単語が3つだからです
>main()の戻り値がint型なのに、
>呼び出し元に何も返していないのはなぜですか?
修正しました。
>ぬっちさん
修正しました。申し訳ないです。
しかし自分の環境で動かしてからソースは貼っていますので、私の環境ではこのままで動きました。
>strcmp()を使うんだったら、
>stdlib.h
>ではなくって
>string.h
>じゃないですか?
私の環境では動きましたが、そちらの方が正しいようなので修正します。
>iの定義時に0で初期化している理由は何ですか?
私の理解力では説明がしづらいのですが文字列が0から始まるからです
>flgは、定義しただけで使っていないようですが、
>どういった存在意義がありますか?
試行錯誤していた時に使った物の消し忘れです。すいません。
>strcmp()は、0、正の整数値(1とは限らない)、
>それから、負の整数値(-1とは限らない)を返す場合があります。
>負の整数値が返ってきたらどうしますか?
考えていなかったので検討します。
>a[5]と定義した理由は何ですか?
3でよかったですね…すいません。
>cを3で初期化した理由は何ですか?
単語が3つだからです
>main()の戻り値がint型なのに、
>呼び出し元に何も返していないのはなぜですか?
修正しました。
>ぬっちさん
修正しました。申し訳ないです。
しかし自分の環境で動かしてからソースは貼っていますので、私の環境ではこのままで動きました。
Re: 二次元配列の比較
これは私の憶測でしかないのですが、boxさんが聞きたかったことというのは、なぜint i=0;としているのに、for文の第1項目でi=0と再び初期化する必要があるのかということではないでしょうか?ZERO さんが書きました:>iの定義時に0で初期化している理由は何ですか?
私の理解力では説明がしづらいのですが文字列が0から始まるからです
これは最初に出していただいたソースコードで正しいと思います。ZERO さんが書きました:>strcmp()は、0、正の整数値(1とは限らない)、
>それから、負の整数値(-1とは限らない)を返す場合があります。
>負の整数値が返ってきたらどうしますか?
考えていなかったので検討します。
私もそのようにしました。
なぜ、修正したあとのソースコードでは、else if( strcmp( x[ i ], y ) == 1 )としてしまったのですか?
ただ単にelseでよいと思うのですが^^;
Re: 二次元配列の比較
ZERO さんが書きました:
>iの定義時に0で初期化している理由は何ですか?
私の理解力では説明がしづらいのですが文字列が0から始まるからです
直後のfor文で、また0で初期化していますね。定義時に0で初期化することは必要ですか?
>cを3で初期化した理由は何ですか?
単語が3つだからです
単語が2個だったらどうしますか?4個だったら?
そのたびにcの初期値も変えるのですか?
コンピューターに数えさせるのが楽ではありませんか?
例えば、
int c = sizeof(a) / sizeof(a[0]);
のように。
こうしておけば、aの要素数を変えれば、それに連動してcの値も変わります。
楽しましょうよ。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: 二次元配列の比較
そうですね…iの初期化する必要はありませんでしたぬっち さんが書きました: これは私の憶測でしかないのですが、boxさんが聞きたかったことというのは、なぜint i=0;としているのに、for文の第1項目でi=0と再び初期化する必要があるのかということではないでしょうか
これは最初に出していただいたソースコードで正しいと思います。
私もそのようにしました。
なぜ、修正したあとのソースコードでは、else if( strcmp( x[ i ], y ) == 1 )としてしまったのですか?
ただ単にelseでよいと思うのですが^^;
自分もelseのみで良いと思ったのですが、elseのみだと"morning"か"sunny"を入力すると0が返ってしまったのでそうしました。
これは欠陥でしょうか?
全くありませんでした。すいません。box さんが書きました: 直後のfor文で、また0で初期化していますね。定義時に0で初期化することは必要ですか?
アドバイスありがとうございます。box さんが書きました: 単語が2個だったらどうしますか?4個だったら?
そのたびにcの初期値も変えるのですか?
コンピューターに数えさせるのが楽ではありませんか?
例えば、
int c = sizeof(a) / sizeof(a[0]);
のように。
こうしておけば、aの要素数を変えれば、それに連動してcの値も変わります。
楽しましょうよ。
参考にしてさらに修正してきます。