В чем разница между символом слова [25]; и char word [25] = "";? - PullRequest
0 голосов
/ 08 сентября 2018

Я пробую разные коды, чтобы проверить слова Палиндрома, конечно, есть много способов закодировать их, я каким-то образом нахожу что-то, что вызывает мое любопытство, но я не мог найти ответ где-нибудь, хотя код работает хорошо

Оказалось, что между двумя массивами объявлений 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 голосов
/ 08 сентября 2018

Разница в том, что неинициализированные локальные переменные имеют неопределенные значения.

Когда вы читаете из wordReverse,

strcmp(wordReverse, word)

strcmp принимает две строки, то есть ожидает где-нибудь найти терминатор NUL.

Ваш цикл, который заполняет wordReverse, не завершает его, поэтому вы получаете здесь неопределенное поведение.

Fix:

wordReverse[revCount] = '\0';

после цикла.

Версия, которая инициализирует wordReverse как

char wordReverse[25] = "";

работает, потому что он эквивалентен char wordReverse[25] = { '\0' }, который устанавливает первый элемент на '\0' явно, а все остальные элементы на '\0' неявно.


Примечание:

if (X) return true;
return false;

эквивалентно

return !!X; // Returns 1 if and only if X is not 0, and 0 otherwise
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...