我想从字符指针中获取子字符串,第 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
}