字符和字符不起作用的比较

时间:2019-03-07 20:25:14

标签: c

我尝试了一次(非常糟糕)破解。

这是代码:

#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),则char将为> 48,而在打印字符(%c-如所提供的代码)时,字符号为正确打印。

我想知道我该怎么做?我已经尝试过strcmp,但显然它期望使用字符串而不是char。

1 个答案:

答案 0 :(得分:2)

C标准要求字符'0''1',...和'9'必须是连续的和连续的。因此我们知道'1'的值比'0'的值大1(其他数字类似)。

考虑到以上情况,我们知道

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

请注意,无论在基于ASCII的计算机,EBCDIC或Klingon或其他任何设备上运行,上述所有必须都必须工作。

因此,要将字符形式('0',...,'9')的数字与整数值(0,...,9)进行比较,只需减去'0'来自字符。

if (index == currentChar - '0') /* ... */;