【发布时间】:2013-05-27 13:00:13
【问题描述】:
程序设计课的家庭作业#2
第 1 部分:
- 提示用户输入 8 位帐号 (0-9),重复直到有效。
第 2 部分:
- 提示用户设置 4 位密码 (0-9),重复直到有效。
- 提示用户验证密码,如果无效则返回第 2 部分。
该程序有效,但是,我想验证一些额外的东西:
- 接受前导零,例如 '00123456'
- 拒绝其他字母,例如“12345678a”
- 拒绝其他“单词”,例如“12345678 123abc”
我在想,提示输入字符串,检查它的长度(4 或 8),如果它通过了该测试,则将其转换为整数并继续进行测试。
有什么想法吗?
[ 我知道你们中的很多人不喜欢使用scanf。我更感兴趣的是如何对我的程序进行最小的更改,而不是重新发明 [我的] 轮子! :)]
#include <stdio.h>
int main()
{
int return_val = 0;
int account_number = 0;
int pin_number = 0;
int pin_number_verify = 0;
int valid_pin = 0;
// Account # Validation
while(1)
{
printf ("Please enter your 8 digit account number:\n");
return_val = scanf("%d", &account_number);
if((account_number > 9999999) && (account_number < 99999999))
{
if (return_val == 1)
{
break;
}
}
printf("Invalid account number. Account number must be 8 digits.\n\n");
while (getchar() != '\n'); /* Clear keyboard input buffer */
}
return_val = 0;
// Pin # Validation
while(1)
{
printf ("\nPlease choose a 4 digit pin number:\n");
return_val = scanf("%d", &pin_number);
while (getchar() != '\n'); /* Clear keyboard input buffer */
if((pin_number > 999) && (pin_number < 9999))
{
if (return_val == 1)
{
while(1)
{
printf("Re-enter pin number:\n");
return_val = scanf("%d", &pin_number_verify);
while (getchar() != '\n'); /* Clear keyboard input buffer */
if(pin_number != pin_number_verify)
{
printf("Pin setup unsuccessful\n\n");
break;
}
else
{
valid_pin = 1;
break;
}
}
}
}
if (valid_pin == 1) {
break;
}
printf("Invalid pin number. Pin number must be 4 digits.\n");
while (getchar() != '\n'); /* Clear keyboard input buffer */
}
// Successful account setup prompt
printf("\nPin setup successful!\n");
printf("Account #: %d\n", account_number);
printf("Pin #: %d\n", pin_number);
printf("Have a nice day.\n");
return 0;
}
【问题讨论】:
-
程序是否有效?您是否运行过测试用例以查看是否接受/拒绝了正确的事情?
-
是的,它有效。它有时只是在不应该验证的时候验证,反之亦然。编辑:当我说“不应该”时,我的意思是基于我想要的结果。
-
使用
strtol()可能不需要太多更改并且会容易得多,但根据上面的注释,您可能已经知道这一点。 :) -
我以前从未使用过,但我会调查一下!
-
Restrict user input to 8 digit number 的可能重复项,但它要求大约 4 位数字。
标签: c validation input