• 締切済み

関数 文字

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 とでました。 ずうずうしいですが わかる方やさしい説明お願いします。

みんなの回答

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.4

このようなことがしたいのでしょうか。 #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)
回答No.3

そのコード断片だけでは情報が少なすぎてなんとも言いようがありません. だいたい「subscripted value is neither array nor pointer」というエラーメッセージがどこに対して出ているのかわからないんだし. 可能なら, コード全体 (少なくともその関数全体) を出してもらえませんか? その方がコメントも付けやすいですし. また, エラーメッセージを出してくれるのはありがたいのですが, 「どの行に対して出ているのか」という情報もあるとうれしいです. ついでですが, その scanf は危険だと思う.

  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.2

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% (2126/6288)
回答No.1

とりあえず、ソースコードを全部見せてください。 断片だけだと、状況が正確に把握できないことがあります。

関連するQ&A

  • 文字列の読み込みに関して

    char ch[100]; printf("文字列を入力を入力してください。\n"); scanf("%s",&ch); printf("あなたは%sと入力しましたね。\n",ch); ここでいう&chとは配列全体を指すポインタ それに対して Scanf(“%s”,ch); であるchは配列&ch[0]であり配列chの先頭要素を指すポインタである。 どちらの場合でも表示は同じになります。 ですが、上記の方が間違いであるとするならばうまくいかない 場合はどういうときなのでしょうか? 上記の方は配列全体を指すポインタということですがいまいち イメージがわかないです。

  • c言語のポインタへの文字列入力についてです。

    当方c言語初学者なのですがscanfを使ってポインタに文字列を入力したいのですがバグが発生して進みません・・・どういうことなのでしょうか? #include <stdio.h> int main(void) { char *a; scanf("%s", a); printf("%s", a); return (0); } *aをa[128]; のように配列に変えるとうまくいくことはなんとかわかるのですが・・・助けてください(^_^;)

  • 文字を反転させる。

    以下の手順に従ってプログラムを作成せよ.適宜printf を利用して,入力支援(「文字列を入 力して下さい」などの画面表示)を行うこと. (1) キーボードから文字列を入力し,文字配列s[64] に格納する. (2) 文字配列s[64] に格納されている文字列を逆順にしてt[64] に格納する(配列全部を逆 順にするのではなく,NULL 文字までの要素を逆順にする). (3) t[64] を画面表示する. ポインタ使用不可、ヘッダファイル<stdio.h>だけ 入力された文字を反転させるということでしょうか?? #include <stdio.h> int main(void){ int i; char s[256]; char t[256]; printf("文字列を入力:"); scanf("%s" , s); for ( i = 0; i < '\n'; i++ ){ t[i] = s[i]; } printf("文字列の逆順は%s",t); getchar(); getchar(); return(0); } これだとただ入力された文字を出力するだけになってしまいますよね・・・・。どうすればいいのでしょうか?

  • scanf()関数の使い方について

    はじめまして。 質問があります。 まずは、以下のコードを見てください。 ---------------------------------------------------------------- #include<stdio.h> int main(void) { char c; int i; printf("0を入力すると終了します。\n"); while(1) { printf("文字を入力してください=>"); scanf("%c",&c); printf("入力した文字は %c です。\n",c); printf("数字を入力してください=>"); scanf("%d",&i); if(i==0) { break; } printf("入力した数字は %d です。\n",i); } return 0; } ---------------------------------------------------------------- 上のコードを実行すると、初回はscanf()はcharとintの両方とも 入力待ちになってくれるのですが、2回目以降はcharは入力待ちに なってくれません。これは、なぜなのでしょうか? ご教授お願いします。 現在VC++6.0を使用しております。

  • 入力文字と配列がわからない><

    文字列と配列がよくわかりません・・・。 以下のプログラムで「おく」と入力すると ・ ィ と表示されます・・・。 何がおかしいのでしょうか; int main(){   char a[4];   scanf("%s", a);   printf("a[0] = %c \na[1] = %c \n", a[0], a[1]); }

  • ポインタのポインタの初期化法

     文字列をポインタを使って扱うとき、例えば、初期化は次のように行えますよね。 #include <stdlib.h> char *s; s = (char *)malloc(1000); (これに続いてscanf("%s", s);など)  これと同様にして、二次元の配列を、ポインタのポインタを使って表したいとき、 char **s; と宣言したものを、malloc()関数を使って初期化することはできるのでしょうか。よろしくお願いします。

  • 自作関数を用いた文字の反転

    タイトルのまんまですが入力された文字を反転して表示する方法がわかりません。 #include <stdio.h> char reversecopy(char moji[]) { int i; char reversemoji[51]; for(i = 50; i > 0; i--) { reversemoji[i] = moji[i]; } return reversemoji[50]; } void main(void) { char n[51]; printf("何か文字を入力してください: "); scanf("%s" ,n); reversecopy(n); n[50] = '\0'; printf("%s\n" ,n); return; } ここまでは作ったのですが、表示されるのは反転されていない文字です。どこかおかしい点があったら(絶対あるはずですが)ご指摘いただければ助かります。 よろしくお願いしますm(_ _)m

  • 文字のコピー

    文字配列s[256],t[256]を用意して文字列を入力し、配列sに格納し、その後に配列s の内容を配列t にコピーするプログラムというものなんですが・・・・二つの文字型ポインタp,q で定義し,p = s,q = t として,変数p,q のみを利用してコピーします。 #include <stdio.h> int main ( void ){ char s[256]; char t[256]; char *p; char *q; printf("文字列を入力:"); scanf("%s", s ); p = s; q = t; while(*p != '\0'){ p++; q++; *q = *p; } p = '\0'; printf("文字列は%s",t); getchar(); getchar(); return(0); } ビジュアルスタジオつかってます。 しかしこのように記述するとなぜか最初の文字をよみこんでくれません。 たとえば yasuhiroとすると フasuhiroと出力してしまうのですが なにかいい解決方法はありませんか??

  • C言語での構造体

    C言語の構造体で配列を扱うとき、 struct ○○{  char ○○[○] とすれば出来ますが、同じようにして構造体で二次元配列を扱うことは出来ますか? 一度組んでみたのですが、 #include<stdio.h> struct aaa{ int no; char name[128]; char y_name[128]; char n_name[128]; char s_name[128][128]; }; int main(void){ int i; struct aaa iryo[99]; printf("入力前\n"); /* 構造体配列に scanf()でデータを入力 */ for(i = 0; i < 3; i++) { // printf("input...\n"); scanf("%d", &iryo[i].no); scanf("%s", iryo[i].name); scanf("%s", iryo[i].y_name); scanf("%s", iryo[i].n_name); scanf("%s", iryo[i].s_name); } printf("入力後\n"); printf("出力前\n"); /* 入力データの確認 */ for(i = 0; i < 3; i++) { printf("番号:%02d 内容:%s Y分岐:%s N分岐:%s 他分岐:%s\n", iryo[i].no, iryo[i].name, iryo[i].y_name, iryo[i].n_name, iryo[i].s_name); } printf("出力後\n"); printf("%d",sizeof(struct aaa)); return 0; } としたら、エラーは出ませんが、実行すると何も表示されませんでした。

  • 文字列str内の全ての数字を削除する関数

    文字列str内の全ての数字を削除する関数 void del_digit(char str[]) を作成。 (例えば、"ab1C9"を受け取ったら、"ABC"にする) という関数を作りたいのですが、うまくいきません。 過去に似たような『文字列内の数字削除』の質問をされた方が いましたが、ポインタを使っていました。 http://okwave.jp/qa1775576.html ポインタを使わずにするには、どうしたらよいのでしょうか? 途中まで作ってみたのですが、うまく動きません。 #include <stdio.h> #include <ctype.h> void del_digit(char str[]) {     unsigned i = 0, j = 0;     char ctr[] = {'0'};     while (str[i] != '\0') {           ctr[i] = str[i];           i++;     }     i = 0;     while (ctr[i] != '\0') {           if (ctr[i] < '0' || ctr[i] > '9') {              str[j] = toupper(ctr[i]);              j++;           }           i++;     }     str[j] = '\0'; } int main(void) {     char str[100];     printf("文字列を入力してください:");     scanf("%s", str);     del_digit(str);     printf("%s\n", str);     return (0); }

専門家に質問してみよう