char word [25]和有什么不一样?和char word [25] =“”;?

时间:2018-09-08 09:40:01

标签: c validation initialization

我正在尝试各种代码来检查回文词,确保有很多方法可以编码,我以某种方式找到了激发我好奇心的东西,但是尽管代码运行良好,但我找不到任何答案

发现下面两个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;
}

1 个答案:

答案 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