我想从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";
}
答案 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
:
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
}