Почему я не могу сравнить эти две строки? Строка ввода одинакова, но всегда возвращает false - PullRequest
1 голос
/ 22 марта 2020

Я получил программу генератора случайных паролей отсюда https://codereview.stackexchange.com/questions/138703/simple-random-password-generator А потом я захотел создать простую программу паролей. Который генерирует 3 случайных символа и использует спринт для объединения "REG-" с 3 случайными символами.

REG-xxx

но программа не сравнивает его так, как я ожидаю. Я пропускаю некоторые неожиданные элементы в массиве? Потому что я читал, что массивы char тоже считают символами новой строки или пробела, заранее спасибо. Вот мой код

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

int main(){

    int i;
    srand((unsigned int)(time(NULL)));
    char pass[6];
    char codebook[10];
    char password[10];

    printf("Press enter to get a three-character password\n");
    getchar();

    for (i = 0; i < 1; i++) {
        pass[i] = rand() % 9;
        char capLetter = 'A' + (rand() % 26);
        pass[i + 2] = capLetter;
        char letter = 'a' + (rand() % 26);
        pass[i + 3] = letter;
        printf("%d%c%c\n", pass[i], pass[i + 2], pass[i + 3]);
        sprintf(codebook, "REG-%d%c%c\n", pass[i], pass[i+2], pass[i + 3]);
    }
    system("pause");
    printf("%s\n", codebook);
    fflush(stdin);
    printf("Enter the password: ");
    scanf("%s", password);
    printf("\n%s\n", password);
    printf("%s\n", codebook);
    system("pause");
    if(strcmp(codebook , password) == 0){
        printf("password is correct\n");
    } else{
        printf("password is false\n");
    }


    return 0;
}

1 Ответ

1 голос
/ 22 марта 2020

Здесь вы печатаете новую строку в пароль

sprintf(codebook, "REG-%d%c%c\n", pass[i], pass[i+2], pass[i + 3]);

Позже вы не сможете ввести эту новую строку в пароль, и, следовательно, сравнение не удастся.

Изменение на

sprintf(codebook, "REG-%d%c%c", pass[i], pass[i+2], pass[i + 3]);

решает проблему.

Чтобы найти такую ​​проблему с пробелами в строках, я рекомендую отладку, напечатав строки, обрамляющие их «невозможными», но печатаемыми символами. Как я рекомендовал в комментарии, я обнаружил проблему, введя некоторые дополнительные отпечатки (или изменив существующие):

В этом случае полезный был непосредственно после проблематики c sprintf():

printf("#%s#\n", codebook);
...