0

配列内の要素のインデックスを見つけようとしました....次の関数を使用してintで機能させることができました:

int *getIndexOfInt(int *arr, int size, int check) {
  int *result;
  int *k;
  int count = 0;
  for (int i = 0; i <= size - 1; i++) {
    if (arr[i] == check) {
      k[count] = i;
      count++;
    }

  }
  if (count > 0) {
    *result = *k;
    return result;
  } else
    cout << "Not Found";
}

ただし、文字列に対してこれを試したところ、エラー (プログラムはステータス 11 で終了) または無限ループが発生しました。

int *getIndexOfString(string *arr, int size, string check) {
    int *result;
    int *k;
    int count = 0;
    for (int i = 0; i <= size - 1; i++) {

         if (arr[i] == check) {

            k[count] = i;
            count++;
          }

    }

    if (count > 0) {

        *result = *k;
        return result;
  } 
   else cout << "Not Found";
}

理由を教えてください。また、エラーを修正するのを手伝ってもらえますか?

編集: 結果変数は、メイン関数で使用される配列であり、指定された配列で文字列が見つかったインデックスが含まれています。k 変数は、結果に追加される前に値が格納される単なる配列です。arr は指定された文字列配列であり、サイズは指定されたサイズであり、check はコードが検索する文字列です。

4

4 に答える 4

4

まず、初期化されていないメモリにアクセスしています。奇妙なことは、最初のコードが機能することです。ただし、これはおそらくコンパイラ固有のものです (これらは C++ でよく発生します)。

通常、ローカル変数はスタックに割り当てられ、C++ はデフォルト値を保証しません。したがって、考えられる説明の 1 つは、(ポインタが保存されている同じメモリ アドレスに) 別の有効なポインタがあったことです。さて、このローカル変数を作成したとき、この「古い」アドレスを取得したので、以前に割り当てられたメモリにアクセスしています。現時点では気にしないでください。たとえうまくいったとしても、私たちを信じてください。これに頼るべきではありません。:-)

別の問題は、その戻り値にあります。その配列のサイズがわからない場合、それをどのように使用しますか? std::vector<> のようなもの、構造体などを返す必要があります。長さが不明な配列へのポインタだけではありません!

結果: あなたのコードは想像以上に複雑です。より良い解決策を参照してください:

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

std::vector<int> getIndexes(std::vector<std::string> &input, std::string searched) {
    std::vector<int> result;

    for (int i = 0; i < input.size(); i++) {
        if (input[i] == searched) {
            result.push_back(i);
        }
    }

    return result;
}

int main(int argc, char *argv[]) {
    std::vector<std::string> greetings;
    greetings.push_back("hello");
    greetings.push_back("hi");
    greetings.push_back("bye");
    greetings.push_back("hi");
    greetings.push_back("hello");
    greetings.push_back("bye");

    std::vector<int> indexes = getIndexes(greetings, "hi");

    for (int i = 0; i < indexes.size(); i++) {
        std::cout << indexes[i] << std::endl;
    }

    return 0;
}
于 2013-10-21T17:51:29.693 に答える
2

他の人がそれを提案しました、そしてここに参考のためにそれを置きます。

標準ライブラリを使用できます。特にアルゴリズムstd::find:

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

int main() {
  std::vector<std::string> words = {"one", "two", "three", "four", "five"};
  size_t index = std::distance(words.begin(),
                               std::find(words.begin(), words.end(), "three"));
  std::cout<<"Index: "<<index<<std::endl;
}

(GCC 4.8.1 OS X 10.7.4) としてコンパイル:

g++ indices-in-array.cpp -std=c++11

出力:

Index: 2
于 2013-10-21T18:24:08.257 に答える
1

主な問題は、結果ポインタを有効な配列に初期化していないことです。実際には、ポインターではなくインデックスのベクトルを返す必要がありますが、この方法では、呼び出し元はサイズを認識し、メモリを手動で管理する必要はありません。このようなもの:

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

using namespace std;

vector<int> getIndicesOfString(const vector<string>& in, const string& check) {
    vector<int> ret;
    for (auto it = cbegin(in); it != cend(in); ++it) {
        if (*it == check) ret.push_back(distance(cbegin(in), it));
    }
    return ret;
}

int main() {
    auto v = vector<string>{"red", "orange", "yellow", "green", "blue", "indigo", "violet", "red"};
    auto indices = getIndicesOfString(v, "red");
    copy(cbegin(indices), cend(indices), ostream_iterator<int>(cout, ", "));
}
于 2013-10-21T17:57:37.867 に答える
0

ベクトル用に編集:

std::vector<int> getIndexOfString(string *arr, int size, string check)
{
  std::vector<int> iVect;
  for (int i = 0; i <= size - 1; i++)
  {
    if (arr[i] == check)
    {
      iVect.push_back (i);
      cout << "Found at " << i << endl;
    }
  }

  if (iVect.empty)
     cout << "not found" << endl;

  return iVect;
}

関数に初期化されていないポインタが多すぎます。本当にインデックスまたはポインターを返したいですか? 失敗した場合の戻り値もありません。

于 2013-10-21T17:51:26.830 に答える