我刚开始使用c ++并且很难理解const char*
。我试图将方法中的输入转换为string
,然后更改字符串以在我想要的位置添加连字符,并最终获取该字符串并将其转换回char*
以返回。到目前为止,当我尝试这个时,它给我一个总线错误10。
char* getHyphen(const char* input){
string vowels [12] = {"A","E","I","O","U","Y","a","e","i","o","u","y"};
//convert char* to string
string a;
int i = 0;
while(input != '\0'){
a += input[i];
input++;
i++;
}
//convert a string to char*
return NULL;
}
答案 0 :(得分:2)
首先,您不需要所有代码来从输入构造std::string
。你可以使用:
string a(input);
至于返回新的char*
,您可以使用:
return strdup(a.c_str()); // strdup is a non-standard function but it
// can be easily implemented if necessary.
确保取消分配返回的值。
最好只返回std::string
,这样您的函数用户就不必担心内存分配/释放。
std::string getHyphen(const char* input){
答案 1 :(得分:1)
请勿使用char*
。使用std::string
,就像其他所有人都告诉你的那样。这将消除所有这些问题。
然而,为了完整起见并且因为你想了解背景,让我们来分析一下发生了什么。
while(input != '\0'){
你可能意味着:
while(*input != '\0') {
您的代码将input
指针本身与\0
进行比较,即它检查空指针,这是由于\0
char
的不幸自动转换造成的。如果您尝试与'x'
或'a'
进行比较,那么您将收到编译错误而不是运行时崩溃。
您希望通过*input
取消引用指针,以转到指向的char
。
a += input[i]; input++; i++;
这也行不通。您递增input
指针,然后使用[i]
推进进一步。例如,如果input
增加了三次,那么input[3]
将是传递给函数的原始数组的第7个字符,而不是第4个字符。当您离开数组的边界时,这最终会导致未定义的行为。未定义的行为也可能是您提到的“总线错误10”。
替换为:
a += *input;
input++;
i++;
(实际上,现在不再使用i
,您可以完全删除它。)
让我再次重复一遍:不要使用char*
。使用std::string
。