如何从C ++中的char指针获取子串?

时间:2017-05-28 16:40:48

标签: c++ pointers malloc substring memcpy

我想从char指针获取子串,在第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] = '\0';
      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 << "ok\n";
}

2 个答案:

答案 0 :(得分:1)

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

打印子字符串

如果您只想将char *的子字符串打印到cout,请使用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"相同的地址。答案是&#34; no&#34;,因为p是由malloc()创建的。您可以使用char *比较std::strcmp()字符串。

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

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

答案 1 :(得分:0)

您的代码的主要问题是尝试将字符串与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] = '\0';

    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 << "ok\n";

  delete[] p; // don't forget to delete your memory
}