我正在嘗試制作一個要求用戶輸入的程式,并且 for 回圈應該檢查用戶 id 和 pin 的輸入是否與十個預制帳戶的用戶 id 和 pin 中的任何一個匹配,例如授權系統
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
struct account{
int uid;
int pin;
int user_bal;
};
int main()
{
int scan_uid, scan_pin;
int att = 3;
bool loop = true;
struct account user[10];
user[0].uid = 1234;
user[0].pin = 123456;
user[1].uid = 4181;
user[1].pin = 308592;
user[2].uid =1111;
user[2].pin =111111;
user[3].uid =2222;
user[3].pin =222222;
user[4].uid =4444;
user[4].pin =444444;
user[5].uid =5555;
user[5].pin =555555;
user[6].uid =6666;
user[6].pin =666666;
user[7].uid =7777;
user[7].pin =777777;
user[8].uid =8888;
user[8].pin =888888;
user[9].uid =9999;
user[9].pin =999999;
for (int i; i <= 9; i ){
user[i].user_bal = 1000;
}
do{
printf("\nEnter your user ID: ");
scanf("%d", &scan_uid);
printf("Enter your pin: ");
scanf("%d", &scan_pin);
printf("\n--------------------------------------------\n");
att--;
for (int i; i <= 9; i){
//printf("\n%d", i);
//printf("\n%d", user[i].uid);
//printf("\n%d", user[i].pin);
//printf("\n%d", scan_uid);
//printf("\n%d", scan_pin);
if (user[i].uid == scan_uid && user[i].pin == scan_pin){
loop = false;
}
else{
printf("\nThe username or password is incorrect!");
printf("\nYou have %d attempt(s) left.", att);
if (att > 0)
{
printf("\nPlease try again.\n");
}
else if (att == 0)
{
printf("\nUnauthorized Access.");
printf("\nReport for stolen credit card uploaded.");
}
}
}
}while (att > 0 || loop == false);
return 0;
}
我在 python 中嘗試了相對相同的代碼,它在那里完美運行。我還檢查了“i”是否正確并遞增,以及它是否正確掃描了用戶輸入。一切都好。但是我遇到了一堵磚墻,試圖解決為什么它只是跳過“if/else”并再次掃描輸入。
我還嘗試了一個'else if',它與最初的'if'陳述句相反(!=),但沒有運氣。
謝謝。
uj5u.com熱心網友回復:
其他人已經指出您需要在回圈int i中進行初始化。int i = 0for
但是,我還想在這里指出其他幾個錯誤。首先,您的回圈條件似乎不正確:
while (att > 0 || loop == false)
如果他們還沒有輸入正確的值并且仍然有更多嘗試,您希望繼續回圈。但是,正如所寫,即使用戶輸入了正確的密碼,這也會繼續回圈。我認為這實際上應該是
while (att > 0 && loop == true)
此外,大多數語言不要求您明確比較trueand false,因此以下在風格上更好:
while (att > 0 && loop)
此外,正如所寫,它會提示用戶重試;但是,第一次之后它不會提示用戶再次輸入,因此用戶不可能再試一次。如果用戶輸入不正確,您需要在回圈內再次提示用戶輸入。
uj5u.com熱心網友回復:
幾個問題...
正如丹所說,初始化
i為 0。這將修復段錯誤。當你這樣做時,
loop = false;你需要break;立即。而且,您的 do/while 條件是錯誤的。換成
while (att > 0 || loop == false);_while ((att > 0) && loop);相關“密碼錯誤”的位置不
printf正確。它應該在.for否則,相同的錯誤訊息將針對單個錯誤答案重復 9 次。
for而且,如果我們看到結果loop為假,我們想退出 do/while 回圈[在回圈之后立即]。
這是重構的代碼。注釋如下:
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
struct account {
int uid;
int pin;
int user_bal;
};
int
main(void)
{
int scan_uid,
scan_pin;
int att = 3;
bool loop = true;
struct account user[10];
user[0].uid = 1234;
user[0].pin = 123456;
user[1].uid = 4181;
user[1].pin = 308592;
user[2].uid = 1111;
user[2].pin = 111111;
user[3].uid = 2222;
user[3].pin = 222222;
user[4].uid = 4444;
user[4].pin = 444444;
user[5].uid = 5555;
user[5].pin = 555555;
user[6].uid = 6666;
user[6].pin = 666666;
user[7].uid = 7777;
user[7].pin = 777777;
user[8].uid = 8888;
user[8].pin = 888888;
user[9].uid = 9999;
user[9].pin = 999999;
for (int i; i <= 9; i ) {
user[i].user_bal = 1000;
}
do {
printf("\nEnter your user ID: ");
scanf("%d", &scan_uid);
printf("Enter your pin: ");
scanf("%d", &scan_pin);
printf("\n--------------------------------------------\n");
att--;
// NOTE/BUG: i is uninitialized
#if 0
for (int i; i <= 9; i) {
#else
for (int i = 0; i <= 9; i) {
#endif
// printf("\n%d", i);
// printf("\n%d", user[i].uid);
// printf("\n%d", user[i].pin);
// printf("\n%d", scan_uid);
// printf("\n%d", scan_pin);
if (user[i].uid == scan_uid && user[i].pin == scan_pin) {
loop = false;
// NOTE/FIX: no need to continue loop if we get a match
#if 1
break;
#endif
}
}
#if 1
// stop if everything matched
if (! loop)
break;
#endif
printf("\nThe username or password is incorrect!");
printf("\nYou have %d attempt(s) left.", att);
if (att > 0) {
printf("\nPlease try again.\n");
}
else if (att == 0) {
printf("\nUnauthorized Access.");
printf("\nReport for stolen credit card uploaded.");
}
} while (att > 0);
return 0;
}
在上面的代碼中,我使用cpp條件來表示舊代碼和新代碼:
#if 0
// old code
#else
// new code
#endif
#if 1
// new code
#endif
注意:這可以通過運行檔案來清理unifdef -k
uj5u.com熱心網友回復:
- 首先,您應該將 i 初始化為 0
- 要瀏覽所有陣列內容,您應該在指令 NOT before (i ) 而不是 ( i) 之后遞增 i
- 條件 while 回圈錯誤
查看您的代碼的此版本,它可以正常作業:
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
struct account{
int uid;
int pin;
int user_bal;
};
int main()
{
int scan_uid, scan_pin;
int att = 3;
bool loop = true;
struct account user[10] = {0};
user[0].uid = 1234;
user[0].pin = 123456;
user[1].uid = 4181;
user[1].pin = 308592;
user[2].uid =1111;
user[2].pin =111111;
user[3].uid =2222;
user[3].pin =222222;
user[4].uid =4444;
user[4].pin =444444;
user[5].uid =5555;
user[5].pin =555555;
user[6].uid =6666;
user[6].pin =666666;
user[7].uid =7777;
user[7].pin =777777;
user[8].uid =8888;
user[8].pin =888888;
user[9].uid =9999;
user[9].pin =999999;
for (int i = 0; i <= 9; i ){
user[i].user_bal = 1000;
}
do{
printf("\n--------------------------------------------\n");
printf("\nEnter your user ID: ");
scanf("%d", &scan_uid);
printf("Enter your pin: ");
scanf("%d", &scan_pin);
printf("\n--------------------------------------------\n");
att--;
for (int i = 0; i <= 9; i ){
//printf("\n%d", i);
//printf("\n%d", user[i].uid);
//printf("\n%d", user[i].pin);
//printf("\n%d", scan_uid);
//printf("\n%d", scan_pin);
if (user[i].uid == scan_uid && user[i].pin == scan_pin)
{
loop = false;
break;
}
}
if (loop && att)
{
printf("\nThe username or password is incorrect!");
printf("\nYou have %d attempt(s) left.", att);
}
else if (! att && loop)
{
printf("\nUnauthorized Access.");
printf("\nReport for stolen credit card uploaded.\n");
}
else if (!loop)
{
printf("\nMatches !\n");
}
} while ((att > 0) & (loop == true));
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/520266.html
標籤:C
上一篇:如何在C中實作并行性?
下一篇:處理OS函式名稱與宏不匹配
