• ベストアンサー

たすけて!

tailkuppaの回答

  • ベストアンサー
  • tailkuppa
  • ベストアンサー率53% (52/98)
回答No.2

1. #include <string.h> は入っていますか?  今回は問題ないけど、引数が間違っていたりするときに参考になるので、入れておいた方が無難ですよ。 2. parray_size はちゃんと p のサイズになっていますか?  というか、どこで宣言していますか?  これがp の配列数より大きいと質問のようなエラーになりそうです。 3. この関数(Lookup)を呼んでいる箇所のソースが欲しいです。  そっちで間違っている可能性のほうがありそう。 4. とりあえず、下記のような感じで動くことを確認しました。 #include <stdio.h> #include <stdlib.h> #include <string.h> int parray_size = 3; int main(void) {  static char *p[3] = { "ほげ", "ふが", "もげ" };  char buffer[10];  printf ("%d\n", Lookup(p, "ない"));  printf ("%d\n", Lookup(p, "ほげ")); } int Lookup(char *p[],char buffer[]) {  int i;  for (i=0;i< parray_size;i++) {   if (!strcmp(p[i],buffer)) {    break;   }  }  if (i== parray_size) {   return 0;  }  else {   return 1;  } }

swd21c
質問者

お礼

tailkuppaさん回答ありがとう御座いました! 問題のほうはめでたく解決しました! サンプルのほう、とっても役に立ちました。 ではでは~。

swd21c
質問者

補足

1.string.hは入ってます。 2.parray_sizeはプリプロセッサで、   #define parray_size 10000   の様に、定義しています。 3.これが呼び出し部分です。   /*(前略)*/   void main(void) {   char *p[parray_size];   char buffer[parray_size];   /*(中略)*/     printf("What's a word to lookup? ");      scanf("%s",buffer);      if(Lookup(p,buffer))     printf("%s is exist.\n\n", buffer);   else printf("%s is not exist.\n\n", buffer); }

関連するQ&A

  • Cのポインタについて

    int howiwork(char *s, char **tab) { int i; if( s == NULL ) return ERROR; for ( i = 0;*tab;tab++,i++) if(! strcmp(s,*tab)) return i; return ERROR; } このプログラミングの機能を教えていただきたいのですがお願いします。

  • ネットで落ちていた「Excelで作ったデータ(CSVファイル)の読み込

    ネットで落ちていた「Excelで作ったデータ(CSVファイル)の読み込みプログラム」をそのままコンパイルして実行しようと思ったのですが、 sample.c: In function 'main': sample2.c:9: warning: return type of 'main' is not 'int' と、表示されてしまいます。 プログラミング初心者なので、どこが間違っているのかわかりません。 回答またはアドバイスの程、よろしくお願いいたします。 ネットで落ちていたプログラムを以下に記載します。 sample2.c #include <stdio.h> #define MAX_ITEM_SIZE 100 #define MAX_LINE_SIZE 1024 char *GetCSVItem(char *wp, char *buff, int size); void main(int argc, char *argv[]) { FILE *fp; char buff[MAX_LINE_SIZE], *wp, item[3][MAX_ITEM_SIZE]; int i1, len; if(argc != 2){ printf("コマンドの入力形式が間違っています.\n"); return; } fp = fopen(argv[1], "r"); if(fp == NULL){ printf("ファイルがオープンできません[%s].\n", argv[1]); return; } for(;;){ if(fgets(buff, MAX_LINE_SIZE, fp) == NULL) break; len = strlen(buff); if(len == 0 || buff[len-1] != '\n'){ if(feof(fp) == 0){ printf("データが不正です[%s].\n", buff); return; } } buff[len-1] = '\0'; wp = buff; if((wp = GetCSVItem(wp, item[0], MAX_ITEM_SIZE)) == NULL){ printf("エラー(1)\n"); break; } if((wp = GetCSVItem(wp, item[1], MAX_ITEM_SIZE)) == NULL){ printf("エラー(2)\n"); break; } if((wp = GetCSVItem(wp, item[2], MAX_ITEM_SIZE)) == NULL){ printf("エラー(3)\n"); break; } if(*wp != '\0'){ printf("エラー(4)\n"); break; } for(i1 = 0; i1 < 3; i1++){ printf("%d:%s\n", i1+1, item[i1]); } } fclose(fp); } char *GetCSVItem(char *wp, char *buff, int size) { int i1; buff[0] = '\0'; while(*wp == ' ' || *wp == '\t') wp++; if(*wp == '\0'){ return(NULL); } for(i1 = 0; i1 < MAX_ITEM_SIZE; i1++, wp++){ if(i1 >= size) return(NULL); buff[i1] = *wp; if(*wp == '\0'){ buff[i1] = '\0'; return(wp); } if(*wp == ','){ wp++; buff[i1] = '\0'; break; } } return(wp); }

  • cygwinを使ってcsvファイルを読み込み、出力させようとしています

    cygwinを使ってcsvファイルを読み込み、出力させようとしています。 とりあえず、読み込みのみのプログラムを作成し、 実行させてみたのですが(run ファイル名.csv と入力) 「Error: could not start C:\cygwin\home\ユーザー名ファイル名.csv」 と出力され、読み込みができず、困っています。 プログラム初心者です。 恐縮ですがご回答よろしくお願いします。 以下に、読み込みプログラムとcsvファイルを記載します。 (プログラムは拾い物です。) <プログラム> #include <stdio.h> #define MAX_ITEM_SIZE 100 #define MAX_LINE_SIZE 1024 char *GetCSVItem(char *wp, char *buff, int size); void main(int argc, char *argv[]) { FILE *fp; char buff[MAX_LINE_SIZE], *wp, item[3][MAX_ITEM_SIZE]; int i1, len; if(argc != 2){ printf("comand error nyuuryoku keishiki\n"); return; } fp = fopen(argv[1], "r"); if(fp == NULL){ printf("can not open file[%s].\n", argv[1]); return; } for(;;){ if(fgets(buff, MAX_LINE_SIZE, fp) == NULL) break; len = strlen(buff); if(len == 0 || buff[len-1] != '\n'){ if(feof(fp) == 0){ printf("data error[%s].\n", buff); return; } } buff[len-1] = '\0'; wp = buff; if((wp = GetCSVItem(wp, item[0], MAX_ITEM_SIZE)) == NULL){ printf("error(1)\n"); break; } if((wp = GetCSVItem(wp, item[1], MAX_ITEM_SIZE)) == NULL){ printf("error(2)\n"); break; } if((wp = GetCSVItem(wp, item[2], MAX_ITEM_SIZE)) == NULL){ printf("error(3)\n"); break; } if(*wp != '\0'){ printf("error(4)\n"); break; } for(i1 = 0; i1 < 3; i1++){ printf("%d:%s\n", i1+1, item[i1]); } } fclose(fp); } char *GetCSVItem(char *wp, char *buff, int size) { int i1; buff[0] = '\0'; while(*wp == ' ' || *wp == '\t') wp++; if(*wp == '\0'){ return(NULL); } for(i1 = 0; i1 < MAX_ITEM_SIZE; i1++, wp++){ if(i1 >= size) return(NULL); buff[i1] = *wp; if(*wp == '\0'){ buff[i1] = '\0'; return(wp); } if(*wp == ','){ wp++; buff[i1] = '\0'; break; } } return(wp); } <csvファイル> 1,2,3 11,12,13 21,22,23

  • strcmp と strcpy の使い方で疑問

    学校のレポートである一文の中から相異なる単語の出現頻度を求めよ。 と言う課題がでたのですが、コンパイルをしたらエラーがでます。いろいろいじったのですがやっぱりできません。力を貸して下さい。 下のはプログラムのわからない箇所の中見です。 combineの中に全て小文字の英文が入ってます。 struct compare { char word[256][256]; int count; }number[256]; を最初に作って、新しくでてきた単語をwordに、また同じ単語が被ったときにcountを一つずつ足していこうとおもってます。 あとbufferは比較するときに一時的に入れておくchar型の変数です。 自分の勝手な予想ですが、strcmpとかには構造体とかが入ったやつは使えないと思っています。 解決策を教えてください。 for(i = 0; i < 256; i++){ number[i].count = 0; } while(scanf("%s", combine) != EOF){ for(i = 0; i < num_word; i++){ if(strcmp(number[i].word, buffer) == 0){ number[i].count++; break; } } if(i == num_word){ strcpy(number[i].word, buffer); num_word++; } } for(i = 0; i < num_word; i++){ printf("%s は %d 回出ました。\n", number[i].word, number[i].count); }

  • H21年春期基本情報技術者午後問11(JAVA)

    H21年春期基本情報技術者午後問11(JAVA)で、 [プログラム2]の 引数textに格納される物が分かりません。 分かる方、教えて下さい。 //プログラム1 class GapBuffer { private static final int INITIAL_GAP_SIZE = 128; private char[] buffer; private int gapOffset = 0; private int gapSize = INITIAL_GAP_SIZE; GapBuffer(String initialText){ buffer = new char[initialText.length() + gapSize]; System.arraycopy(initialText.toCharArray(), 0, buffer, gapSize, initialText.length()); } void insert(int offset, char ch) { confirmGap(offset); buffer[gapOffset++] = ch; gapSize--; } void delete(int offset){ if (length() == 0) return; confirmGap(offset + 1); gapOffset--; gapSize++; } char charAt(int offset) { if (offset >= gapOffset) offset += gapSize; return buffer[offset]; } int length() { return buffer.length - gapSize ;} private void confirmGap(int newGapOffset){ if (gapSize == 0) { char[] temp = new char[buffer.length + INITIAL_GAP_SIZE]; System.arraycopy(buffer, 0, temp, 0, buffer.length); gapOffset = buffer.length; gapSize = INITIAL_GAP_SIZE; buffer = temp; } if(newGapOffset < gapOffset) { System.arraycopy(buffer, newGapOffset, buffer, newGapOffset + gapSize, gapOffset - newGapOffset); } else { System.arraycopy(buffer, gapOffset + gapSize, buffer, gapOffset, newGapOffset - gapOffset); } gapOffset = newGapOffset; } } /プログラム2 class Editor { private GapBuffer buf; private int cursor = 0; private Editor(String text) { buf = new GapBuffer(text);←此処です } private void run() { Display.output(buf, cursor); char ch; while ((ch = CharReader.get()) != CharReader.EOF) { switch (ch){ case CharReader.MOVE_FORWARD: moveCursor(1); break; case CharReader.MOVE_BACKWARD: moveCursor(-1); break; case CharReader.DELITE: if (cursor < buf.length()) { buf.delete(cursor); } break; default: buf.insert(cursor++, ch); break; } Display.output(buf, cursor); } } private void moveCursor(int n) { int newCursor = cursor + n; if (newCursor >= 0 && newCursor <= buf.length()) { cursor = newCursor; } } public static void main(String[] args) { Editor editor = new Editor(args[0]); editor.run(); } }

  • 動かないです

    おかしなところが有ったらアドバイス・修正等お願いします。 うしろ3行を表示させたいです。 0~2行の場合はその分だけ表示させたいです。 # include <stdio.h> # include <stdlib.h> # include <string.h> char *getline(void) { char *buf = NULL; int size = 0; int oldsize; do { oldsize = size; size = size * 2 + 80; buf = realloc(buf, size + 1); if(!buf) { fprintf(stderr, "memory allocation failed\n"); exit(1); } if(!fgets(buf + oldsize, size + 1 - oldsize, stdin)) if(oldsize) break; else { free(buf); return NULL; } }while(strlen(buf + oldsize) == size - oldsize); return buf; } void scan(char **lines, int n_lines) { char *p; int i; for(i = 0; i < n_lines; i++) lines[i] = NULL; while(p = getline()) { free(lines[0]); for(i = 0; i < n_lines - 1; i++) lines[i] = lines[i+1]; lines[n_lines - 1] = p; } } void print(char **lines, int n_lines) { int i; for(i = 0; i < n_lines; i++) if(lines[i]) fputs(lines[i], stdout); } int main(void) { char *lines[3]; int i; scan(lines, 3); print(lines, 3); for(i = 0; i < 3; i++) free(lines[i]); return 0; }

  • C++でismbblead()が使えない。

    http://www.orchid.co.jp/computer/cschool/kanji1.html 上記のサイトを参考にVS2013で以下のようなソースを書きました。 #include "stdafx.h" #include "stdio.h" int _tmain(int argc, _TCHAR* argv[]) { char *str = "123498765abcd漢字0000"; int i1; for (i1 = 0;;){ if (str[i1] == '\0')break; if (_ismbblead(str[i1])){ if (str[i1 + 1] == '\0'){ break; } putchar('['); putchar(str[i1++]); putchar(str[i1++]); putchar(']'); continue; } putchar(str[i1++]); } return 0; } 残念なことにコンパイルはとうらず、ismbbleadの部分が引っ掛かっているようでした。 C++だと使えないCのメソッドもあるのでしょうか? そういうわけでないのであればなぜ、コンパイルは通らないのでしょうか?C言語のコンパイラでは問題なく参考サイトのソースはコンパイルできました。 出ているエラーは IntelliSense: 識別子 "_ismbblead" が定義されていません error C3861: '_ismbblead': 識別子が見つかりませんでした というものでした。よろしくお願いします。

  • 2分木のノードの指定方法を変えたい

    下のプログラムはコマンドライン引数できまった形で入力した数を2分木にしてそれを表示させるc言語のプログラムです。 きまった形というのは 短縮形は [ 8 [ 7 2 5 ] [ 3 1 _ ] ] 短縮形でないのは [ 8 [ 7 [ 2 _ _ ] [ 5 _ _ ] ] [ 3 [ 1 _ _ ] _ ] ] ] のような形で、実行結果はそれぞれ a.exe [ 8 [ 7 2 5 ] [ 3 1 _ ] ] 入力データ [ 8 [ 7 2 5 ] [ 3 1 _ ] ] a.exe [ 8 [ 7 [ 2 _ _ ] [ 5 _ _ ] ] [ 3 [ 1 _ _ ] _ ] ] ] 入力データ [ 8 [ 7 2 5 ] [ 3 1 _ ] ] のようになります。 これをこのような形ではなくコマンドラインで 8 7 3 2 5 1 と入力するだけで2分木になるように 下のプログラムを変えたいのです。 よろしくお願いします。 #include <stdio.h> #include <stdlib.h> #include <string.h> typedef int BITREE_TYPE; /* 格納データの型 */ struct node { BITREE_TYPE value; /* ノードの値 */ struct node *left; /* 左ノードのアドレス */ struct node *right; /* 右ノードのアドレス */ }; typedef struct node BITREE_NODE; void error(char *msg); BITREE_NODE *createNode(BITREE_TYPE x); void destroyBITree(BITREE_NODE *p); int isLeafNode(BITREE_NODE *p); void printBITree(BITREE_NODE *p, int tabs, int brief); BITREE_NODE *inputBITree(char *str[], int len, int *end); int gShortFormat = 1; /*1ならば短縮形で出力する*/ void error(char *msg){ fflush(stdout); fprintf(stderr,"%s\n", msg); exit(1); } BITREE_NODE *createNode(BITREE_TYPE x){ BITREE_NODE *new; new = malloc(sizeof(struct node)); if(new == NULL) error("createNode: メモリがありません"); new->value = x; new->left = NULL; new->right = NULL; return new; } void destroyBITree(BITREE_NODE *p){ if(p == NULL) return; destroyBITree(p->left); destroyBITree(p->right); memset(p, 0, sizeof(struct node)); free(p); } int isLeafNode(BITREE_NODE *p){ return(p->left == NULL) && (p->right == NULL); } void printSubtree(BITREE_NODE *p){ if(p == NULL){ printf("_"); return; } if(gShortFormat != 0 && isLeafNode(p)){ printf("%d", p->value); } else{ printf("[ "); printf("%d ", p->value); printSubtree(p->left); printf(" "); printSubtree(p->right); printf(" ]"); } } void printBITree(BITREE_NODE *p, int tabs, int brief){ int i; gShortFormat = brief; for (i = 0; i<tabs; i++) printf("\t"); printSubtree(p); printf("\n");fflush(stdout); } BITREE_NODE *inputBITree(char *str[], int len, int *end){ BITREE_NODE *p; int i =0; if(len < 1) error("inputBITree:データがありません"); /*短縮形の処理*/ if(strcmp(str[0], "[") != 0){ if(strcmp(str[0], "_") == 0) error("inputBTITree:値に_は指定できません"); *end =1; return createNode(atoi(str[0])); } p = createNode(atoi(str[1])); i = 2; if(strcmp(str[i], "_") != 0){ p->left = inputBITree(&str[i], len -i, end); i+= *end; } else{ i++; } if(strcmp(str[i], "_") != 0){ p->right = inputBITree(&str[i], len -i, end); i+= *end; } else{ i++; } if(strcmp(str[i], "]") != 0) error("inputBITree: 入力データが]で終わっていません"); *end = i + 1; return p; } int main(int argc, char *argv[]){ BITREE_NODE *p; int end = 0; p = inputBITree(argv+1, argc-1, &end); printf("入力データ "); printBITree(p,0,1); destroyBITree(p); return 0; }

  • 質問です。

    このソースのメイン関数でabcxyzと入力すると、xがあるので、関数で、a(char *sew)が呼び出されて、この関数には、abcxyz渡って、関数内では、x以外なら、sewを++します。なぜ、x以外のabxyzと表示されないんでしょうか?xyzになるのが分かりません。教えてください。よろしくお願いします #include <stdio.h> char *a(char *sew) { char *p=sew; while (*p != 'x') { p++; } return(p); } int main(void) { char str[21] ={'\0'}; int i=0,no=0; char ch; printf("文字を入力してください:"); while (i<21) { ch=getchar(); if (ch=='\n') {break;} else if (ch != '\0' && ch != '\0') { str[i] =ch; i++; } } for(i=0; i<20; i++) { if(str[i]=='x') { printf("'x'以降は%sです。\n", a(str)); no=1; break; } } if (no==0) printf("'x'は見つかりませんでした。"); return (0); }

  • C++ template コンパイルできないパターン

    度々お世話になります。 以下のソースがコンパイルできません。 ご存知の方がいらっしゃれば教えて下さい。 #include <iostream> #include <exception> template<typename T, T C> inline T check(T x) { if (x == C) { throw(std::exception()); } return x; } int main() { using namespace std; int x; try { char * p = "abc"; check<char*, 0>(p); // コレがコンパイルできない int i = 2; check<int, 4>(i); // コレはコンパイルできる } catch (...) { cerr << "err" << endl; } return 0; } 手元の環境だと % g++ foo.cc foo.cc: In function 'int main()': foo.cc:18: error: no matching function for call to 'check(char*&)' となります。 関係するのか分からないのですが char* をテンプレートの引数にしているのに コンパイラのエラーメッセージは char*& となっているのがよく分かりません。 目的としては、エラーチェックをして エラーをであれば、例外を投げるというものです。