- 締切済み
関数 文字
osはlinuxコンパイラはccです。 文字列を配列で定義したものが入力したものと同じかどうか調べその単語の意味を表示するにはどうしたらいいですか? ちなみに char *dic[5][2] = {{"book","本"}・・・{"grape",葡萄"}} のように英語と日本語の対応表を作成しています。 調べるときは、char型の配列c[20]にscanf("%s",&c)で入力したものを for(i=0;i<5;i++) { if(dic[i][0]==d) scanf("%s",dic[i][1]); } で調べています。 コンパイルしたら subscripted value is neither array nor pointer subscripted value is neither array nor pointer とでました。 ずうずうしいですが わかる方やさしい説明お願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- asuncion
- ベストアンサー率33% (2127/6289)
このようなことがしたいのでしょうか。 #include <stdio.h> #include <string.h> int main(void) { char *dic[][2] = { { "book", "本" }, { "water", "水" }, { "telephone", "電話" }, { "money", "お金" }, { "grape", "葡萄" }, }; char c[20]; int n = sizeof(dic) / sizeof(dic[0]), i; printf("意味を調べたい英単語:"), scanf("%s", c); for (i = 0; i < n; ++i) { if (strcmp(c, dic[i][0]) == 0) break; } if (i < n) printf("%sの意味は%sです。\n", c, dic[i][1]); else printf("%sの意味はわかりません。\n", c); return 0; }
- Tacosan
- ベストアンサー率23% (3656/15482)
そのコード断片だけでは情報が少なすぎてなんとも言いようがありません. だいたい「subscripted value is neither array nor pointer」というエラーメッセージがどこに対して出ているのかわからないんだし. 可能なら, コード全体 (少なくともその関数全体) を出してもらえませんか? その方がコメントも付けやすいですし. また, エラーメッセージを出してくれるのはありがたいのですが, 「どの行に対して出ているのか」という情報もあるとうれしいです. ついでですが, その scanf は危険だと思う.
- mtaka2
- ベストアンサー率73% (867/1179)
scanf("%s", ○) で渡すのは「char(文字)へのポインタ」です。 一方「char型の配列c[20]」の場合、cは配列であり、cで「char へのポインタ」になります。&c だと「charの配列へのポインタ」になってしまいます。 ですから、scanfの引数は「scanf("%s", c);」になります。 ループの中ですが、「if (dic[i][0] == d)」とすると「ポインタが等しいかどうか」の判定になります。「ポインタの指し示す先の「文字列」が等しいかどうか」の判定にはなりません。 文字列として等しいかどうかを判定する場合は、関数strcmpなどを使って 「if (strcmp(dic[i][0], d) == 0)」のようにします。 その次の行がscanfなのはprintf の間違いかな。
- asuncion
- ベストアンサー率33% (2127/6289)
とりあえず、ソースコードを全部見せてください。 断片だけだと、状況が正確に把握できないことがあります。