C ISMEMBER功能崩溃

C++ isMember function crash

本文关键字:崩溃 功能 ISMEMBER      更新时间:2023-10-16

我正在制作一个程序,该程序将测试字符串数组中的字符串存在。我做了一个简单的功能:

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"。我不确定问题是什么,帮助会很好。

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->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

array->length(); 

不是数组的长度。这是阵列中的第一个std ::字符串的长度。考虑使用std :: vector of std :: string。

除非该订单在容器中很重要,否则最好选择一个std :: set(multiSet)。

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;
}

您正在比较恒定值。您仅在数组 -> length()&lt; 10然后无限地执行循环时执行循环。也

array->length()

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