PAT-乙級-1081. 檢查密碼 (15)問題程式碼求助(已解決)
阿新 • • 發佈:2019-01-03
1081. 檢查密碼 (15)
時間限制400 ms記憶體限制65536 kB
程式碼長度限制8000 B
判題程式Standard作者CHEN, Yue
本題要求你幫助某網站的使用者註冊模組寫一個密碼合法性檢查的小功能。該網站要求使用者設定的密碼必須由不少於6個字元組成,並且只能有英文字母、數字和小數點".",還必須既有字母也有數字。
輸入格式:
輸入第一行給出一個正整數 N(<=100),隨後 N 行,每行給出一個使用者設定的密碼,為不超過80個字元的非空字串,以回車結束。
輸出格式:
對每個使用者的密碼,在一行中輸出系統反饋資訊,分以下5種:
- 如果密碼合法,輸出“Your password is wan mei.”;
- 如果密碼太短,不論合法與否,都輸出“Your password is tai duan le.”;
- 如果密碼長度合法,但存在不合法字元,則輸出“Your password is tai luan le.”;
- 如果密碼長度合法,但只有字母沒有數字,則輸出“Your password needs shu zi.”;
- 如果密碼長度合法,但只有數字沒有字母,則輸出“Your password needs zi mu.”。
5 123s zheshi.wodepw 1234.5678 WanMei23333 pass*word.6輸出樣例:
Your password is tai duan le. Your password needs shu zi. Your password needs zi mu. Your password is wan mei. Your password is tai luan le.
//這個題不知道為什麼有個樣例沒有通過,寫此貼求助。
經評論區大佬指點,發現了問題所在,當密碼有空格的時候scanf會認為它需要讀下一個字串了,而忽視了空格的存在。
改正方法有兩個。
1、直接利用gets()函式,但是需要在迴圈之前getchar()一下吃掉n後面的回車。
2、仍然利用scanf()函式,但改為scanf("%[^\n]",a[i]);這個意思是到回車(換行)的時候才開始讀下一個字串。但是與gets()函式不同的是,需要在迴圈中scanf("%[^\n]",a[i]);之後加個getchar();吃掉回車。
#include<stdio.h> #include<string.h> int judge(char a[81]) { int zimu=0; int shuzi=0; int other=0; for(int j=0;j<strlen(a);j++) { if((a[j]>='A'&&a[j]<='Z')||(a[j])>='a'&&a[j]<='z') zimu++; else if(a[j]>='0'&&a[j]<='9') shuzi++; else if(a[j]=='.') continue; else other++; } if(other!=0) return 2; else if(zimu!=0&&shuzi==0) return 3; else if(shuzi!=0&&zimu==0) return 4; else return 0; } main() { int n,i; scanf("%d",&n);getchar();//方法一和二都要加個getchar() int num[110]; char a[110][81]; for(i=0;i<n;i++) { num[i]=0; /*scanf("%s",a[i]);//原錯誤寫法*/ gets(a[i]); /*方法二scanf("%[^\n]",a[i]);getchar();*/ if(strlen(a[i])<6) { num[i]=1; continue; } else { num[i]=judge(a[i]); continue; } } for(int i=0;i<n;i++) { if(num[i]==0) printf("Your password is wan mei.\n"); if(num[i]==1) printf("Your password is tai duan le.\n"); if(num[i]==2) printf("Your password is tai luan le.\n"); if(num[i]==3) printf("Your password needs shu zi.\n"); if(num[i]==4) printf("Your password needs zi mu.\n"); } return 0; }