这个程序接受任何四位数作为引脚,所以我使用strlen()
来确定引脚是否有四个字符,但我需要确保用户输入四个数字,我该如何使用循环前的isdigit()
和循环条件?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
char pin [4];
printf("Please enter your pin : \n") ;
scanf("%4s" , &pin) ;
system("cls") ;
while (strlen(pin) != 4) {
count = count + 1 ;
if(count < 3){
printf("Invalid Pin \n") ;
printf("Please enter your pin again \n") ;
scanf("%4s", &pin) ;
system("cls");
}
else if (count == 3){
printf("Sorry you can't continue , Please contact your bank for assistance !") ;
return 0 ;
}
}
答案 0 :(得分:2)
这段代码存在很多问题,我可能没有在这个答案中涵盖每一个问题:
您的主要功能在哪里?你不能在函数之外拥有代码;那不起作用。除了全局变量声明,常量值赋值,typedef,struct和enum定义之外的C代码,必须包含在函数中。在您的情况下,您可能希望main
函数容纳从第6行开始的代码。
使用字符串参数调用scanf
时,请不要使用字符串的地址 - 数组本身就是一个引用。
在将任何值复制到strlen(pin)
之前调用pin
是100%未定义的行为。由于内存未初始化,strlen
函数将继续查找空字符,并可能超出数组边界。
C字符串以空值终止。声明用于保存 n 字符的字符串时,需要声明大小为 n + 1 的数组,以便为空字符留出空间。
答案 1 :(得分:0)
首先回答你的问题
我会写一个帮助函数&#39; validatePin&#39;这将检查引脚长度并验证引脚是否为数字引脚,您可以扩展此功能以执行您需要的任何其他验证。它可能看起来像下面的
const int PIN_OK = 0;
const int PIN_INVALID_LEN = -1;
const int PIN_INVALID_CHARS = -2;
int validatePin(const char *pin)
{
// Valdiate PIN length
if (strlen(pin) != 4) return PIN_INVALID_LEN;
// Validate PIN is numeric
for (int i = 0; i < 4; ++i)
{
if (!isdigit(pin[i])) return PIN_INVALID_CHARS;
}
return PIN_OK;
}
然后你可以调整你的while循环看起来像下面的
while (validatePin(pin) != PIN_OK)
{
....
}
有关您的代码的其他要点。
我没有运行您的代码,因此可能还有其他问题乍一看我错过了。
答案 2 :(得分:0)
有很多方法可以做你需要做的事情。您既可以检查输入长度,也可以只选择验证您已阅读的内容。一种方法是:
#include <stdio.h>
#include <ctype.h>
enum { TRIES = 3, NPIN };
int main (void) {
char pin[NPIN+1] = "";
size_t tries = 0, pinok = 0;
for (; tries < TRIES; tries++) { /* 3 tries */
printf ("Please enter your pin : ");
if (scanf (" %4[^\n]%*c", pin) == 1) { /* read pin */
pinok = 1;
size_t i;
for (i = 0; i < NPIN; i++) /* validate all digits */
if (!isdigit (pin[i]))
pinok = 0;
if (pinok) /* if pin good, break */
break;
}
}
if (!pinok) { /* if here and not OK, call bank */
fprintf (stderr, "Sorry you can't continue, Please contact "
"your bank for assistance.\n") ;
return 1;
}
printf ("\n correct pin : %s\n\n", pin); /* your pin */
return 0;
}
(注意:以防止一次输入过长的字符串,您应该在每次迭代的外部stdin
循环结束时清空for
)
示例使用/输出
案例失败:
$ ./bin/pin
Please enter your pin : a555
Please enter your pin : 555a
Please enter your pin : 55a5
Sorry you can't continue , Please contact your bank for assistance.
成功案例:
$ ./bin/pin
Please enter your pin : 2345
correct pin : 2345
看看它,如果您有任何问题,请告诉我。