1

私はC++プログラミングに非常に慣れていないので、その理由がわかります。

線形探索関数で検索したいいくつかの単語で構成される文字配列を作成したいと思います。この配列は2次元配列である必要がありますか?例えば:

char Colors[3][6] = {"red", "green", "blue"};

私はこのようにそれを試しました:

char Colors[] = {"red", "green", "blue"};

これにより、「初期化子が多すぎます」というエラーが発生しました。

最初の方法は、配列内の要素の量と要素の最大長を示しているので正しいと思いますが、正しいですか?

では、線形検索関数を実装して、その配列内の単語を見つけるにはどうすればよいでしょうか。次のようなことはできますか?

(linearSearch関数がすでに宣言されていると仮定します)

char searchKey;  
char element;

char Colors[3][6] = {"red", "green", "blue"};

printf("Enter the color to look for: \n");

scanf("%s", searchKey);

element = linearSearch(Colors, searchKey, ??); //?? is where I don't know what to enter

if (element != -1)  
{  
    printf("Found the word.\n");  
}  
else  
{  
    printf("Didn't find the word.\n");  
}

これは可能ですか?もしそうなら、宣言はlinearSearch関数を何を探しますか?これがある程度使えるように十分な情報を提供したことを願っています。

編集:助けてくれてありがとう、プログラムを意図したとおりに動作させました。

4

6 に答える 6

9

非常に役立つC++標準ライブラリについて学ぶことをお勧めします。例えば、

#include <vector>
#include <string>
#include <algorithm>
#include <iostream>

using namespace std;

vector<string> words;
words.push_back("red");
words.push_back("blue");
words.push_back("green");

if (find(words.begin(), words.end(), "green") != words.end())
    cout << "found green!"
else
    cout << "didn't find it";

なぜ自分で実装するlinearSearchのですか?C ++にはすでにstd::findそれがあります!さらに、のset代わりにを使用する場合、セットがソートされるため、O(n)の代わりにO(log n)をvector使用できるようになりました。std::binary_search

于 2009-05-24T21:04:28.840 に答える
3

文字列の配列を宣言するには、この構文を使用します

 char *Colors[] = {"red", "green", "blue"};

これは文字へのポインタの配列です(「Hi」は「H」を指すconst char *に評価されます)。コンパイラは、配列を格納するために必要な要素の数を計算します(したがって、[])。この場合、配列は常にサイズ3になります。

全体として、私はrlbondの答えに同意します-STLを使用する必要があります。

于 2009-05-24T21:22:48.007 に答える
2

配列内の検索語のインデックスを返すようにlinearSearch関数を作成できます。サンプルプログラムは次のとおりです。

#include <stdio.h>
#include <string.h>

int linearSearch (const char **Array, const char *searchKey, int arraySize) {
    for (int i = 0; i < arraySize; ++i) {
        if (strcmp(Array[i], searchKey) == 0)
            return i;
    }

    // We didn't find the searchKey in the Array
    return -1;
}

int main () {
    char *colors[] = { "red", "green", "blue" };

    int index = linearSearch (colors, "green", 3);

    if (index < 0) { // search string was not found
        printf("Search string not found!\n");
    }
    else {
        printf("String %s found at index %d\n", colors[index], index);
    }

    return 0;
}

strcmp()関数を使用して文字列を比較します。文字列が一致する場合はゼロを返し、一致しない場合は非ゼロを返します。string.hこれを使用するには、ヘッダーを含める必要があります。

ただし、他の人が示唆しているように、可能であればSTLを使用する必要があります。

于 2009-05-24T21:05:43.190 に答える
2

いいえ、2次元配列は必要ありません。

文字列配列を宣言する方法は次のとおりです。

char* Colors[3] = {"red", "green", "blue"};

また

char* Colors[] = {"red", "green", "blue"}; // the compiler will figure out the size

int colors = sizeof(Colors)/sizeof(Colors[0]);

C ++を試した直後に、STLの使用方法を学ぶ必要があります。

于 2009-05-24T21:26:49.153 に答える
0

この記事には、文字列検索機能が含まれています。また、文字配列を適切に構造化する方法についての洞察も得られるはずです。

于 2009-05-24T21:03:40.743 に答える
0

文字列を使用せず、char配列を使用したくない場合は、strcmpを使用して2つの単語を比較できます。strcmpで覚えておくべきことは、単語が見つかった場所のインデックスを返すことです。したがって、最初に単語だけを見つけたい場合は、次のようにします。

for(int i=0;i<SizeOfColorArray;i++)
{
    if(strcmp (MySearchTerm,colors[i]) == 0)
    {
        // it was  a match
        return i;
    }
}

何をしているのか、配列がどれだけ大きくなるのかに応じて、パフォーマンスを向上させるために文字列のハッシュを検討することを検討する必要があります。

于 2009-05-24T21:15:16.743 に答える