Сравнение между char и char не работает - PullRequest
0 голосов
/ 07 марта 2019

Я сделал (очень плохую) попытку взломать.

Это код:

#include <stdio.h>
#include <string.h>

int main()
{
    char passphrase[20];
    printf("Welcome to first_level.\n");
    printf("Hello. What's your passphrase?\n");

    fgets(passphrase,20,stdin);

    passphrase[strcspn(passphrase, "\n")] = 0;

    if(strlen(passphrase) != 10){
        // you lost
    } else
    {
        int counter = 0;
        for(int i = 0; i < 10; i++)
        {
            char index = i;
            char currentChar = passphrase[i];
            //printf(passphrase[i]);
            printf("---\nindex: %d\nchar: %c\n",index, currentChar);
            if(index == currentChar){
                //printf("ass\n");
                counter++;
            }
        }
        if(counter == 10)
        {
            printf("Congrats!\n");
            return 0;
        }

        printf("counter %d\n", counter);
    }

    printf("You lost!\n");
    return 0;
}

Теперь теоретически сравнение символов должно работать.К сожалению, я считаю, что символы преобразуются в int, а затем сравниваются.

С магическим printf перед сравнением я заметил, что, если я напечатаю число (% d), символ будет> 48, тогда какпри печати символа (% c - как предоставленный код) номер символа печатается правильно.

Мне интересно, как я мог это сделать?Я уже пробовал strcmp, но, очевидно, он ожидает строку, а не символ.

1 Ответ

2 голосов
/ 07 марта 2019

Стандарт C предписывает, чтобы символы '0', '1', ... и '9' были последовательными и последовательными. Итак, мы знаем, что значение '1' на 1 больше, чем значение '0' (и аналогично для других цифр).

Принимая во внимание вышесказанное, мы знаем, что

'0' - '0' == 0;
'1' - '0' == 1;
....
'9' - '0' == 9;

Обратите внимание, что все вышеперечисленное должно работать так, как я описал, независимо от того, работает ли оно на компьютере на основе ASCII, или на EBCDIC, или на Klingon, или на любом другом.

Таким образом, для сравнения цифр в символьной форме ('0', ..., '9') с целочисленными значениями (0, ..., 9) просто вычтите '0' из символа.

if (index == currentChar - '0') /* ... */;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...