1

私たちが持っているとしましょう:

string list[]= {"12.34.56.78","55.34.5","23.44.5"}

ユーザーに、文字列でもある文字列の一部を入力してもらいたい: たとえば、文字列 55 と、文字列 a をループし、文字列全体を探して出力します"55.34.5"

str文字列入力であり、文字列listの完全なリストです

for (int i=0; i<n; i++){
  for (int j=0; j<(list[i].length()); j++){
    for (int k=0; k<(str.length()); k++){
      if (list[i][j] == str[k])
        cout<<list[i]<<endl;
      else
        break;

ただし、これには問題があり、正しく動作しません。

アップデート:

だから私は自分のコードを次のように更新しました:

for (int i=0; i<n; i++)
    if (strncmp(list[i].c_str(), str.c_str(), str.length()) == 0)){
      cout<<list[i]<<endl;
      }

ただし、これは文字列を出力しません。

4

3 に答える 3

2

list[i] の最初の文字と文字列の最初の文字を比較するだけです。対応する最初の文字が一致する場合は、i 番目の文字列全体を出力し、比較対象の文字列へのオフセットを変更せずに、オフセット k を str に進めます。内側の 2 つのループを省略して、固定長の文字列比較を使用できると思います。つまり、

for (int i=0; i < n; i++) {
  if (strncmp(list[i].c_str(), str.c_str(), str.length()) == 0) {
    // match
  }
}
于 2012-09-25T02:14:59.873 に答える
2

関数の狂信者の場合(動作を確認してください):

std::string findInList(const std::vector<std::string> &searchFrom, const std::string &lookFor) {
    for (const std::string &s : searchFrom) {
        if (s.find(lookFor) != std::string::npos)
            return s;
    }

    return "";
}

ベクトルの方が優れており、配列のサイズを取得するために余分な作業を必要としないため、配列の代わりにベクトルを使用しました。C++11 が使用されていない場合、通常の for ループは問題なく機能します。

これはまた、最初の一致が返されることを前提としています。おそらくより良いオプションは、何も見つからない場合は空の文字列のベクトルを返すことです。見つかった文字列を返す代わりに、それをベクトルに追加して続行し、完了したらベクトルを返します。

標準アルゴリズムをモデル化したい場合は、実際のコンテナーの代わりに開始イテレーターと終了イテレーターを使用することもできます。これにより、配列を含む任意のタイプのコンテナーで、そのコンテナー内の任意の範囲を参照して呼び出すことができます。

両方の点を考慮して、次のように進化させることができます (動作を確認してください)。

template <typename Iterator>
std::vector<std::string> findInList(Iterator start, const Iterator end, const std::string &lookFor) {
   std::vector<std::string> ret;

   for (; start != end; ++start)
       if (start->find(lookFor) != std::string::npos)
           ret.emplace_back(*start);

   return ret;
}

繰り返しますが、C++11 を使用していない場合はemplace_backpush_back.

于 2012-09-25T02:23:54.723 に答える
0

これは、前の両方の回答を組み合わせた回答です。クラスのメンバー検索関数を使用しますstd::string

for (int i=0; i < n; i++) {
    if (list[i].find(str) != std::string::npos) {
        std::cout << list[i] << std::endl;
    }
}
于 2012-09-25T12:19:44.310 に答える