Как мне сделать так, чтобы каждое имя пользователя соответствовало своему собственному паролю?
Ваш код в настоящее время написан, все, что вы делаете, - это проверяете соответствие 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" );