我正在尝试各种代码来检查回文词,确保有很多方法可以编码,我以某种方式找到了激发我好奇心的东西,但是尽管代码运行良好,但我找不到任何答案
发现下面两个char wordReverse声明数组之间存在细微差别。
有人能解释这两个声明吗?
bool checkPallen(char word[]){
char wordReverse[25] = ""; //error if used char wordReverse[25];
int revCount = 0;
for(int i = strlen(word) - 1; i >= 0; i--){
wordReverse[revCount] = word[i]; //
revCount++;
}
if(strcmp(wordReverse, word) == 0) return true;
return false;
}
答案 0 :(得分:3)
区别在于未初始化的局部变量具有不确定的值。
当您从wordReverse
阅读时,
strcmp(wordReverse, word)
strcmp
包含两个字符串,即它希望在某个位置找到NUL终止符。
填充wordReverse
的循环不会终止它,因此您在这里会得到不确定的行为。
修复:
wordReverse[revCount] = '\0';
循环之后。
将wordReverse
初始化为的版本
char wordReverse[25] = "";
之所以起作用,是因为它等效于char wordReverse[25] = { '\0' }
,后者将第一个元素显式设置为'\0'
,所有其余元素都隐式设置为'\0'
。
NB:
if (X) return true;
return false;
等同于
return !!X; // Returns 1 if and only if X is not 0, and 0 otherwise