如何从C++中的字符指针获取子字符串



我想从字符指针中获取子字符串,第 1 行成功打印正常,但如果是第 2 行则不成功。但在 cout 印花中,它就是这样。

为什么?我该如何纠正它?

char* substring(const char* src, int start_index, int end_index){ // src - source
  int length = end_index - start_index;
  char *dest; // destination
  if (length < 0) {
    return NULL;
  } else {
      dest = (char*)malloc(sizeof (char)* (length + 1));
      dest[length] = '';
      memcpy(dest, src + start_index, length);
      return dest;
  }
}
int main() {
  //char *p = "phab"; // line 1
  char *p = substring("alphabet",2, 6); // line 2
  cout << p << endl;
  if (p == "phab") cout << "okn";
}

许多不同的方法可以做到这一点。

打印子字符串

如果只想打印要cout char *的子字符串,请使用 write()

const char *str = alphabet;
int start_index = 2, end_index = 6;
std::cout.write(str + start_index, end_index - start_index);

构造 std::string

如果要构造std::string

const char *str = alphabet;
int start_index = 2, end_index = 6;
std::string substr{str + start_index, end_index - start_index};
std::string substr{str + start_index, str + end_index}; // equivalent
std::cout << substr;
const char *substr_ptr = substr.c_str(); // watch out for lifetime

比较

如果要比较,if (p == "phab")比较p是否包含与"phab"地址相同的地址。 答案是否定的,因为p是由malloc()创建的。 您可以使用std::strcmp()比较char *字符串。

if (std::strcmp(p, "phab") == 0) {
    cout << "okn";
}

否则,substring()函数工作正常,尽管它不是惯用C++,也不执行任何错误检查。 请记住,std::malloc可以返回 NULL。 大多数人在C++不使用malloc是有原因的。

代码的主要问题是尝试将字符串与p == "phab"进行比较。

这不会比较字符串,而是比较它们在内存中的位置。要比较字符串,请使用 std::strcmp。

我对您的代码进行了一些注释/建议。

char* substring(const char* src, int start_index, int end_index) {
    int length = end_index - start_index;
    if (length < 0)
        return NULL;
    char* dest = new char[length + 1]; // use new[] not malloc
    std::copy(src + start_index, src + end_index, dest); // prefer to memcopy
    dest[length] = '';
    return dest;
}
int main() {
  //char *p = "phab"; // line 1
  char* p = substring("alphabet", 2, 6); // line 2
  cout << p << endl;
  // use strcmp()
  if (std::strcmp(p, "phab") == 0) cout << "okn";
  delete[] p; // don't forget to delete your memory
}

相关内容

  • 没有找到相关文章

最新更新