如何检查字符串是否在字符串数组中

时间:2013-11-30 18:11:37

标签: c++ arrays string

#include <iostream>
#include <string>
using namespace std;

bool in_array(string value, string *array)
{
    int size = (*array).size();
    for (int i = 0; i < size; i++)
    {
        if (value == array[i])
        {
            return true;
        }
    }

    return false;
}

int main() {
    string tab[2] = {"sdasd", "sdsdasd"};
    string n;
    cin >> n;
    if (in_array(n, tab)) {

    }
    return 0;
}

如果 n 字符串位于标签数组中,我想检查C ++,但代码会返回错误。 我做错了什么?也许我应该使用矢量?

2 个答案:

答案 0 :(得分:25)

int size = (*array).size();

它不会告诉你array的大小,它会告诉你该数组中第一个字符串的长度,你应该将数组的长度分别传递给函数。该函数应如下所示:

bool in_array(string value, string *array, int length)

但更好的选择是使用std::vectorstd::find

bool in_array(const std::string &value, const std::vector<string> &array)
{
    return std::find(array.begin(), array.end(), value) != array.end();
}

然后,您可以像:

一样使用它
int main() {
    std::vector<std::string> tab {"sdasd", "sdsdasd"};

    if (in_array(n, tab)) {
        ...
    }
}

答案 1 :(得分:5)

当一个数组作为参数传递给只接受指针的函数时,你不能查询函数中数组的大小(因为它被转换为“愚蠢”指针到了第一个元素,仅此而已。您通常会在签名或“结束”迭代器中添加“count”参数。

您尝试实施的内容基本上是std::find。它需要两个迭代器(序列的开始和结束)和要找到的元素。只需使用此功能。

std::find(std::begin(tab), std::end(tab), n);
如果找到了元素,

将返回一个迭代器,否则返回结束迭代器。检查与end迭代器的相等性将告诉您是否在数组中找到了元素。

如果你不喜欢std算法的“迭代器接口”,你可以通过使用模板函数包裹std::find来实现类似PHP的签名:

template<class Element, class Container>
bool in_array(const Element & element, const Container & container)
{
    return std::find(std::begin(container), std::end(container), element)
            != std::end(container);
}

请注意:这个答案假设是C ++ 11。如果使用较旧的编译器,它可能不起作用,或者仅在将-std=c++11添加到编译器标志时才有效。