【问题标题】:C++ isMember function crashC++ isMember 函数崩溃
【发布时间】:2014-02-05 16:36:04
【问题描述】:

我正在制作一个程序来测试字符串在字符串数组中是否存在。为此我做了一个简单的函数:

bool isMemberOfArrayStr(std::string str, std::string array[256]){
  for(int i=0;array->length()<10;i++){
    if(array[i]==str){
      ret=true;//A global variable that will be reset to false after the function call
    }
  }
  return ret;
}

函数的定义没有错误,但是调用:

if(neighbors[2] == isMemberOfArrayStr(neighbors[2], validTokens))
{
  std::cout <<"true"
}

导致运行时错误“分段错误:11”。 我不确定是什么问题,如果有帮助会很好。

【问题讨论】:

  • 我建议您在代码中包含using namespace std;,以不断避免std::
  • @Vkt0rS。从不建议这样做。 using namespace std is a bad programming practice.
  • @0x499602D2 - 头文件是不好的做法,但在 .cpp 中还不错
  • neighbors[2] 是一个std::string(因为它可以作为第一个参数传递给isMemberOfArrayStr。为什么还要检查neighbors[2] == isMemberOfArrayStr(neighbors[2], validTokens)。本质上是比较std::string == bool。跨度>
  • 好评@0x499602D@

标签: c++ function crash segmentation-fault runtime-error


【解决方案1】:
bool isMemberOfArrayStr(std::string str, std::string array[256])

衰减到

bool isMemberOfArrayStr(std::string str, std::string* array)

正确的原型是

bool isMemberOfArrayStr(std::string str, std::string (&array)[256])

但您可以使用std::arraystd::vector,它们的语法更好(更直观)。

那么array-&gt;length()不是256,而是数组第一个字符串的长度。

您的函数可能会被重写 (C++11):

bool isMemberOfArrayStr(const std::string& str, std::string (&array)[256]) {
    ret = std::find(std::begin(array), std::end(array), str) != std::end(array);
    return ret;
}

C++03:

bool isMemberOfArrayStr(const std::string& str, std::string (&array)[256]) {
    ret = std::find(array, array + 256, str) != array + 256;
    return ret;
}

我认为无论如何你都应该从这个函数中删除ret

【讨论】:

  • 这看起来像是一个改进,但我可能做错了什么。我仍然遇到几个错误:非成员函数不能有'const'限定符,命名空间'std'中没有名为'begin'或'end'的成员,没有匹配函数调用'isMemberOfArrayStr' ...isMemberOfArrayStr(neighbors [2 ],validTokens)){
  • @bakman329:添加了 C++03 版本。以前是 C++11。 (而且我认为这是一种方法)。
【解决方案2】:
array->length(); 

不是数组长度。这是数组中第一个 std::string 的长度。 考虑使用 std::string 的 std::vector。

除非容器中的顺序很重要,否则最好选择一个 std::set (multiset)。

【讨论】:

  • 会使用 (sizeof(array)/sizeof(*array)
  • @bakman329 如果在函数中使用它,请回答“否”。因为在这种情况下,'array' 是一个指向 std::string 的简单指针。
  • @0x499602D2 只有矢量当然是不够的。我只是认为最好使用更高级的构造来避免随机错误(指针和数组之间的混淆)。
【解决方案3】:
bool isMemberOfArrayStr(std::string str, std::string array[256]){
  for(int i=0;array->length()<10;i++){
                     ^^^^^^^^^^
    if(array[i]==str){
      ret=true;//A global variable that will be reset to false after the function call
    }
  }
  return ret;
}

您正在比较常量值。仅当 array->length()

array->length()

是数组中第一个元素(如果有的话!)的长度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    相关资源
    最近更新 更多