Как сопоставить имя пользователя с паролем в c? - PullRequest
0 голосов
/ 04 августа 2020

Я хочу написать программу входа в систему. Я хочу, чтобы каждое имя пользователя совпадало с его паролем c. Например, имя пользователя «Asma» должно входить в систему только с паролем «Hello123», а не с «Welcome».

Но почему-то, когда я ввожу каждое имя пользователя и пароль из строкового массива, он говорит: «Выполнен вход успешно". Как сделать так, чтобы каждое имя пользователя совпадало с собственным паролем? Кроме того, как мне снова запросить действительный ввод, если имя пользователя и пароль неверны?

Вот мой код:

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

int main(void)
{
    char username[10];
    char password[10];

    printf("Enter your username: ");
    scanf("%s", username);

    printf("Enter your password: ");
    scanf("%s", password);

    if(strcmp(username,"Asma") == 0 || strcmp(username,"Iffat") == 0 || strcmp(username,"Kamal") == 0 ){
    if(strcmp(password,"Hello123") == 0 || strcmp(password,"Welcome") == 0  || strcmp(password,"fr1324") == 0 ){

        printf("Logged In Successfully");   

        }else{
    printf("Incorrect username or password, please try again! ");
}

}else{

printf("Incorrect username or password, please try again! ");    
}

Ответы [ 2 ]

4 голосов
/ 04 августа 2020

Если вы хотите сопоставить имя пользователя с паролем, вы должны использовать &&, чтобы убедиться, что обе проверки прошли успешно:

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

int main(void)
{
    char username[10];
    char password[10];

    printf("Enter your username: ");
    scanf("%s", username);

    printf("Enter your password: ");
    scanf("%s", password);

    if (strcmp(username, "Asma") == 0 && strcmp(password, "Hello123") == 0
        || strcmp(username, "Iffat") == 0 && strcmp(password, "Welcome") == 0
        || strcmp(username, "Kamal") == 0 && strcmp(password, "fr1324") == 0) {
            printf("Logged In Successfully");
    } else {
        printf("Incorrect username or password, please try again! ");
    }
}
3 голосов
/ 04 августа 2020

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

Ваш код в настоящее время написан, все, что вы делаете, - это проверяете соответствие any имя пользователя и любой пароль - вы не сопоставляете указанный c пароль с указанным c именем пользователя.

И хотя проверка каждого имени и пароля явным образом подходит как с первой попытки масштабирование не произойдет - это быстро станет неуправляемым после 5 имен пользователей или около того. Возможно, вам будет лучше создать таблицу поиска имен и паролей, используя тип struct:

struct usertable {
  char *name;
  char *pass;
};

...

struct usertable users[] = { // array size is taken from the number of initializers
  {"Asma", "Hello123"},
  {"Iffat", "Welcome"},
  {"Kamal", "fr1234"},
  ...                        // any other entries
  {NULL, NULL}               // explicitly mark the last entry in the table
};

, а затем после ввода имени пользователя и пароля вы циклически просматриваете таблицу следующим образом:

/**
 * Cycle through all the entries in users until logged_in is true
 * or we hit the end of the table.  
 */
int logged_in = 0;
for ( size_t i = 0; users[i].name != NULL && !logged_in; i++ )
{
    /**
     * Perform a logical AND against the results of strcmp for both
     * the username and password, assign the result (0 or 1) to logged_in.
     */
  logged_in = (strcmp( username, users[i].name ) == 0 &&
               strcmp( password, users[i].pass ) == 0 );
}

if ( !logged_in )
  printf( "Username or password not found, try again\n" );

Кроме того, как мне снова запросить действительный ввод, если имя пользователя и пароль неверны?

Поместите все вышеперечисленное в al oop который завершается только при совпадении пароля или когда вы сигнализируете EOF при вводе (используя Ctrl-D или Ctrl-Z, в зависимости от вашей системы):

int logged_in = 0;

/**
 * Loop until the logged_in flag is true or we see a break statement
 */
while ( !logged_in ) 
{
  printf( "Enter username: " );         // scanf is *not* the right tool for
  if ( scanf( "%s", username ) == EOF ) // this, but we'll keep it in place
    break; // exit while loop           // because otherwise this example
                                        // would be three times as big
  printf( "Enter password: " );         // and I don't to bury the main point
  if ( scanf( "%s", password ) == EOF ) // of the exercise.
    break; // exit while loop

  for( size_t i = 0; users[i].name != NULL && !logged_in; i++ )
  {
    logged_in = (strcmp( users[i].name, username ) == 0 && 
                 strcmp( users[i].pass, password ) == 0 );
  }

  if ( !logged_in )
  {
    fprintf( stderr, "Username or password not found, try again.\n" );
    fprintf( stderr, "Type Ctrl-Z to quit.\n" );
  }
}

/**
 * If logged_in is still 0 at this point, that means the user entered
 * Ctrl-Z to quit, and we exit the program.
 */
if ( !logged_in )
{
  fprintf( stderr, "Exiting...\n" );
  exit( EXIT_SUCCESS );              // "Normal" exit
}

printf( "Logged in successfully\n" );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...