为递归函数修改字符串文字
Modifying string literals for recursive function
我有一个递归函数,它应该检查给定的单词是否是回文,它通过比较第一个和最后一个值来工作,然后将它们剥离并递归地传递给 checkPalindrome,但每当我尝试将字 [size-1] 分配给 '\0',我得到一个总线错误。
这是我的代码:
bool checkPalindrome(char word[]){
int size = std::strlen(word);
//Parts removed...
word[size-1]='[=10=]'; //This is the line causing the issue
return checkPalindrome(word+1);
}
}
下面是调用此函数的示例:
checkPalindrome("racecar");
谢谢!
解决这个问题我想到了两种方法:
最明显的方法是使用 std::string
而不是字符串文字,只使用 .pop_back()
(C++11) 来删除最后一个字符。
第二种方法是将字符串的长度作为参数传递给函数,而不是计算它。然后,只需将长度减少 1
,这样现在您就有了一个新的 "fake end point" 字符串。由于您使用此数字来检查最后一个字符,因此实际上不需要修改字符串,只需更改 "last" 字符所在的位置即可。
但是既然您使用的是 C++,我不明白为什么不使用 std::string
并避免使问题过于复杂。
因此,如评论中所述,您不能修改字符串文字。
所以在将它传递给函数之前,先复制它。
std::size_t len = std::strlen(word);
char* copy = new char[len + 1];
std::strncpy ( copy, word, len + 1 );
isPalindromeR(copy);
delete[] copy;
其他解决方案是不使用递归,因此不需要修改字符串。
无论如何在作业之外使用 std::string
我有一个递归函数,它应该检查给定的单词是否是回文,它通过比较第一个和最后一个值来工作,然后将它们剥离并递归地传递给 checkPalindrome,但每当我尝试将字 [size-1] 分配给 '\0',我得到一个总线错误。
这是我的代码:
bool checkPalindrome(char word[]){
int size = std::strlen(word);
//Parts removed...
word[size-1]='[=10=]'; //This is the line causing the issue
return checkPalindrome(word+1);
}
}
下面是调用此函数的示例:
checkPalindrome("racecar");
谢谢!
解决这个问题我想到了两种方法:
最明显的方法是使用 std::string
而不是字符串文字,只使用 .pop_back()
(C++11) 来删除最后一个字符。
第二种方法是将字符串的长度作为参数传递给函数,而不是计算它。然后,只需将长度减少 1
,这样现在您就有了一个新的 "fake end point" 字符串。由于您使用此数字来检查最后一个字符,因此实际上不需要修改字符串,只需更改 "last" 字符所在的位置即可。
但是既然您使用的是 C++,我不明白为什么不使用 std::string
并避免使问题过于复杂。
因此,如评论中所述,您不能修改字符串文字。 所以在将它传递给函数之前,先复制它。
std::size_t len = std::strlen(word);
char* copy = new char[len + 1];
std::strncpy ( copy, word, len + 1 );
isPalindromeR(copy);
delete[] copy;
其他解决方案是不使用递归,因此不需要修改字符串。
无论如何在作业之外使用 std::string