修改字符串文字以实现递归功能

时间:2018-10-16 16:31:46

标签: c++ c-strings

我有一个递归函数,应该检查给定单词是否是回文,该函数通过比较第一个和最后一个值来工作,然后将其剥离并递归地传递给checkPalindrome,但是无论何时我尝试分配word [size-1]设为“ \ 0”,则出现总线错误。

这是我的代码:

bool checkPalindrome(char word[]){
  int size = std::strlen(word);
  //Parts removed...
  word[size-1]='\0'; //This is the line causing the issue
  return checkPalindrome(word+1);
  }
}

以下是对此函数的调用示例:

checkPalindrome("racecar");

谢谢!

2 个答案:

答案 0 :(得分:2)

有两种方法可以解决此问题:

一个明显的方法是使用std::string代替字符串文字,而仅使用.pop_back()(C ++ 11)删除最后一个字符。

第二个方法是将字符串的长度作为参数传递给函数,而不是对其进行计算。然后,只需将长度减少1,这样您就可以为字符串添加一个新的“假端点”。由于您使用此数字检查最后一个字符,因此您实际上不需要真正修改字符串,只需更改“最后一个”字符的位置即可。

但是由于您使用的是C ++,所以我不明白为什么不使用std::string并避免使问题复杂化。

答案 1 :(得分:1)

因此,如注释中所述,您不能修改字符串文字。 因此,在将其传递给函数之前,请对其进行复制。

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