我正在尝试制作一个程序来根据一组规则来确定密码的有效性。
这就是我所拥有的:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <math.h>
int main()
{
int uppercase = 0;
int length = 0;
int numbers = 0;
int others = 0;
char password[13];
char yesOrNo;
printf("Your password must be 8-12 characters long.\n"
"It must contain at least one symbol, uppercase letter, and number.\n\n");
COMEBACK:
printf("Please enter your password:");
scanf(" %s", &password);
while (password != 'NULL') { // Tried 0 here, tried '\0', but to no avail.
if (isalpha(password)) {
length += 1;
if (isupper(password)) {
uppercase += 1;
}
}
else if (isdigit(password)) {
numbers += 1;
length += 1;
}
else {
length += 1;
}
// This is just a test, to see if it was working.
printf("%d - %d - %d - %d --- %s",
uppercase, length, numbers, others, password);
}
if ((uppercase > 0) && (numbers > 0)
&& (length >= 8) && (length <= 12) && (others > 0)) {
printf("Good job, you've done your password correctly.");
} else {
printf("%d - %d - %d - %d --- %s \t Incorrect..",
uppercase, length, numbers, others, password); // Same thing here.
scanf("%s", &yesOrNo);
switch (yesOrNo) {
case 'y':
goto COMEBACK;
break;
case 'n':
printf("Sorry you're dumb man..");
break;
default:
printf("Please enter a valid password.");
}
}
return 0;
}
我遇到的问题是,while循环永远不会结束,因为它似乎找不到我的密码数组的终结符。我输入'\ 0'和'0'。但我仍然无法弄明白。任何帮助表示赞赏。感谢。
答案 0 :(得分:5)
此代码:
while (password != 'NULL') {
应该生成编译器警告。多字符文字是不可移植的,不应与指针进行比较。
您可能需要:
char *ptr = password;
while (*ptr != '\0') {
...
ptr++;
}
或(C99或更高版本):
for (char *ptr = password; *ptr != '\0'; ptr++)
{
...
}
并使用*ptr
来识别角色(或通常是(unsigned char)*ptr
,因为普通char
经常签名而isalpha()
等需要正值或EOF作为输入值)。如果您没有C99,则可以在循环外声明char *ptr;
并删除循环控件中的char *
。
你有:
if (isalpha(password)) {
由于password
是一个数组,因此您需要将固定指针传递给需要非指针(int
)值的函数。我可能会在循环内添加:
{
unsigned char uc = *ptr;
if (isalpha(uc))
...
请注意,对于所有情况,您可能只需要一个length++;
。
另请注意,没有密码可以满足&#39;至少一个符号&#39;标准,因为你永远不会增加others
。
并且goto
可以替换为while()
循环,它也可以检测到EOF:
while (scanf("%12s", password) == 1)
{
length = others = uppercase = numbers = 0; // Ignore previous attempts
for (char *ptr = password; *ptr != '\0'; ptr++)
{
unsigned char uc = *ptr;
length++;
...character testing code...
}
...validity checking code...
}
在您学习C时,假设编译器警告是严重错误。它比现阶段更了解C.
答案 1 :(得分:-1)
password
是一个数组。永远不会是NULL
。但它可以包含一个空终止符,这可能就是你所追求的。只需检查password[0] == '\0'
。