0

我试图在数组中找到元素的索引......我设法使用以下函数使其与整数一起使用:

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 是给定的字符串数组,大小是给定的大小,检查是代码将搜索的字符串。

4

4 回答 4

4

首先,您正在访问未初始化的内存。奇怪的是,您的第一个代码有效。但是,它可能是特定于编译器的(这些事情在 C++ 中经常发生)。

局部变量通常在堆栈上分配,C++ 不保证任何默认值。因此,一种可能的解释是(在保存指针的同一内存地址上)另一个有效的指针。现在,当您创建这个局部变量时,它只是获得了这个“旧”地址,因此它正在访问一些以前分配的内存。只是暂时不要关心它,即使它有效,相信我们 - 你不应该依赖它。:-)

另一个问题是返回值。当您不知道该数组的大小时,您将如何使用它?你应该返回 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 回答