3

私はCを初めて使用するので、使用できるものが組み込まれていることを願っています。リストがあり、リストの場所を見つけたいとします(リスト内のすべてのアイテムは一意です)。そのように: char *name[] = {"monkey", "pig", "goat", "dog", "cat"};私は試しました:

   char *name[] =  {"monkey", "pig", "goat", "dog", "cat"};
   int *found = strstr (*name,"dog");
   printf("Found at %i \n", found); //expect 3(or 4, if it doesn't use 0s) result

しかし、それは私に2の結果を与え続けます(私が存在しない名前を付けたとしても)。私も運が悪かったので交換strstrしました。strcspn

よくわからないので質問していますが、これを行うために独自の関数を作成しましたが、かなりくだらなくて柔軟性がありません(リスト名をハードコーディングしています)。C内に何かがあるかどうかを判断しました。自分。これが私が作った関数です(脳細胞を失いたくない場合は目を覆って、冗談を言ってください:-):

int indexOf(char nameToFind) {
    //returns the location of an item in a list
    int pos = -1;
    int i;
    for (i = 0; i < sizeof(name) / sizeof(name[0]) && pos == -1; i++)
    {
        // Assuming there is a char[] field called name in Stdinfo
        if (*name[i] == nameToFind) {
            pos = i;
        }
    }
    return pos;
}

私のバージョンよりも高速で柔軟性のあるこのようなものがCに存在しますか?

4

2 に答える 2

5

あなたが書いたコードはいくつかのレベルで間違っています。あなたのライン

char *name[] = {"monkey", "pig", "goat", "dog", "cat"};

それぞれが終了した文字列charを指すポインタの配列を作成します。NULLここまでは順調ですね。しかし、あなたのライン

int *found = strstr (*name,"dog");

infoundの最初のオカレンスへのポインタに設定します。意図したとおりに配列を調べないことに加えて、戻り値をに割り当てます。良くない。次の行"dog"*name = name[0] = "monkey"namechar *strstrint *

printf("Found at %i \n", found);

を出力しようとしますfoundが、指定子にはが必要であり、それintを渡します。これらはすべて避けるべきことであり、これの多くは未定義の動作だと思います。foundint *

strcmp必要なのは、たとえば次を使用するループです。

char *name[] = {"monkey", "pig", "goat", "dog", "cat"};
unsigned int numElements = sizeof(name)/sizeof(name[0]);
unsigned int i;
for(i = 0; i < numElements; ++i) {
    if (strcmp(name[i], "dog") == 0) {
        printf("Found at %u\n", i);
        break;
    }
}
if (i >= numElements) {
    printf("Not found\n");
}

配列を関数に渡すと、この方法での計算numElementsは機能しないため、その場合は要素の数を明示的に渡す必要があります。

于 2012-06-04T02:57:39.027 に答える
1

文字配列には、配列からstrchr文字を検索する関数があります。見つかった場合は、その文字へのポインタを返します。そうでない場合は、NULLポインタを返します。次に、ポインタ減算を使用してインデックスを決定できます。

一般的な配列の場合、配列がソートされている場合はライブラリbsearch関数があります。ほとんどのコンパイラはlsearch、配列を線形検索して特定の値を見つけるだけの非標準関数を提供します。

C ++を使用している場合は、、、、およびSTLアルゴリズムにアクセスできますfindlower_boundこれらupper_boundのアルゴリズムは、同様のタスクを実行します。

お役に立てれば!

于 2012-06-04T02:42:19.533 に答える