- ベストアンサー
ポインタと配列
次のソースで、結果表示でポインタを使いたいのですが、うまくいきません。1件しか表示されないのです。 ポインタの扱いがおかしいのだと思いますが、どうしたらよいでしょうか? #include <stdio.h> #include <string.h> int search(char key[256],FILE *fp,char *result[256][256]); main(void) { FILE *fp; int rep,n,i; char x[256],key[256],*result[256][256]; printf("検索キーワードを入力してください。\n" "キーワード>"); gets(key); if((fp=fopen("personal.txt","r"))==NULL) { printf("ファイルをオープンできません\n"); exit(1); } printf("=====検索結果=====\n"); n=search(key,fp,result); for(i=0;i<n;i++) { printf("%s\n",result[i]); } printf("検索結果:%d件です。\n",n); fclose(fp); } int search(char key[256],FILE *fp,char *result[256][256]) { int n=0; char *p,word[256],*name; while((p=fgets(word,256,fp))!=NULL) { if(strstr(word,key)!=NULL) { name=strtok(p," "); strcpy(result[n],name); n++; } } return n; } 実行すると、下の警告がでます。 illegal pointer combination(param)
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ANo.#1 elttacさんので正しいですよ。 関数search内部で、main()スコープ内のresult配列に サーチ文字を格納しています。 Tommy222さんのでは、格納バッファの実態がありません。 破壊活動を行っています。 elttacさんのおっしゃるように > 255 文字の文字の配列は > char result[256]; >のように宣言できます。で,その 256 個の配列は, > char result[256][256]; を理解されるよう・・・ cahr *result[256][256]; では、char* result[256]; > 32ビット=4Byte(32ビットマシンと仮定)ポインタの配列 となりますが・・・ C言語で一番難しい?とこかもしれないけど、覚えれば一番使い勝手がいいところです。 がんばってください。
その他の回答 (1)
- elttac
- ベストアンサー率70% (592/839)
「文字列の配列」の考え方が誤っているようです。 255 文字の文字の配列は char result[256]; のように宣言できます。で,その 256 個の配列は, char result[256][256]; です。ですから,以下のようにすればよいのではないでしょうか。 #include <stdio.h> #include <string.h> int search(char key[256], FILE *fp, char result[256][256]); int main() { FILE *fp; int rep, n, i; char x[256], key[256], result[256][256]; printf("検索キーワードを入力してください。\n" "キーワード>"); gets(key); if ((fp=fopen("personal.txt", "r")) == NULL) { printf("ファイルをオープンできません\n"); exit(1); } printf("=====検索結果=====\n"); n = search(key, fp, result); for (i = 0; i < n; i++) { printf("%s\n", result[i]); } printf("検索結果:%d件です。\n",n); fclose(fp); return 0; } int search(char key[256], FILE *fp, char result[256][256]) { int n = 0; char *p, word[256], *name; while ((p = fgets(word, 256, fp)) != NULL) { if (strstr(word, key) != NULL) { name = strtok(p, " "); strcpy(result[n], name); n++; } } return n; }
お礼
ソースを考えていただき、ありがとうございます。
補足
1件しか結果を表示できません。 配列を戻したいのですが、どうすればよいでしょうか?
お礼
ありがとうございます。 ポインタと構造体などまだまだですね。 これからがんばって勉強していきます。