c ++将数组直接传递给函数

c++ pass array directy to function

  bool foo(const char* arg, const char* str[]){
    for (int i=0; i < (signed)sizeof(str); i++){
      if(strcmp(arg, str[i])) == 0){
        return true;
      }
    }
    return false;
  }

    int main(){
      foo("c", {"a", "b", "c"});
      return 0;
    }

我想将一个 const char* 数组直接传递给函数,就像这里显示的那样。但我不断收到错误消息:cannot convert '<brace-enclosed initializer list>' to 'const char**'

使用字符指针pointer (char**) 来实现。您不能将参数声明为数组,但您可以将数组传递给函数,因为它们将被转换为双指针。

虽然有一种方法可以使用模板并通过引用传递 C 数组,但我不确定这是否是您真正想要的:example

在 C++11 中,我更愿意使用 std::intializer_list 来使调用 foo("c", {"a", "b", "c"}) 按预期工作:

#include <initializer_list>

bool foo(const char* arg, std::initializer_list<const char*> strings) {
    for (const char* str : strings) {
        /* ... */
    }
}

虽然我们正在这样做,但您应该考虑使用 C++ 的字符串功能而不是从 C 继承的字符串功能:

#include <initializer_list>
#include <string>

bool foo(const std::string& arg, std::initializer_list<std::string> strings) {
    for (const auto& str : strings) {
        if (arg == str) {
            return true;
        }
    }
    return false;
}

请注意,std::initializer_list 不拥有它提供访问权限的值,因此如果要存储它,请改用 std::vector 等适当的容器。

此外,如果您只想检查 str 中是否存在 arg, 为什么不使用 std::find

#include <algorithm>
#include <initializer_list>
#include <string>

bool foo(const std::string& arg, std::initializer_list<std::string> strings) {
    return std::find(strings.begin(), strings.end(), arg) != strings.end();
}

虽然建议在使用 C++ 时放弃 C 风格的编程,而是使用 stl 容器,但我想提一下以下 "one-liner" 有效:

bool foo(const char* arg, const char* const* str, size_t siz) {
  for (size_t i = 0; i < siz; i++)
      if (!strcmp(arg, str[i])) return true;
  return false;
}

int main() {
  cout << foo("c", array<char*, 3> { "a", "b", "c" }.data(), 3);
  system("pause");
}

令人惊讶的是,如果我们将foo的第二个参数定义为const char**,编译器(VS2015)会大喊:

bool foo(...): cannot convert argument 2 from 'char **' to 'const char **'

:哦 不能从非常量转换为常量???这对任何人都有意义吗?

编辑:@NeilKirk 在他的评论中对此进行了解释。普通的。因此,签名应为:

bool foo(const char* arg, const char* const* str, size_t siz) 

一切都按预期进行。

您还可以通过模板函数通过引用传递数组,这样您就可以在编译时检测到它的大小(请注意,在您的情况下,数组会衰减为指针,因此 sizeof 不会'做你的想法)。示例:

#include <iostream>
#include <cstring>

template<int N>
bool foo(const char* arg, const char* (&str)[N])
{
    for (std::size_t i = 0; i < N; i++) {
        if (std::strcmp(arg, str[i]) == 0) {
            return true;
        }
    }
    return false;
}

int main() {
    const char* arr[] = {"abc", "de"};
    std::cout << std::boolalpha << foo("de", arr);
}

Live on Coliru

顺便说一句,尝试使用 C++ 标准库中的算法和 std::string 而不是 strcmp() 和原始 C 字符串:

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

bool foo(const std::string arg, const std::vector<std::string>& str)
{
    return std::find(str.begin(), str.end(), arg) != str.end();
}

int main() 
{
    std::cout << std::boolalpha << foo("de", {"abc", "de"});
}

Live on Coliru