为递归函数修改字符串文字

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