void verification() {
char pass[50];
printf(" Enter Password : ");
fgets(pass, 50, stdin);
if (pass != 'aaanc6400') { \\ Warning message in here
printf("\n Invalid Password.. Please enter the correct password. \n\n");
verification();
}
info();
}
当我编译程序时,在标记的行上显示警告“字符常量对于其类型太长”以及“指针和整数之间的比较”。然后当我运行代码并输入正确的密码时,它仍会输出密码错误。我做错了什么?
答案 0 :(得分:5)
警告是关于你声明你有一个很长的角色。
'aaanc6400'
是一个9个字符长的字符,编译器警告你,它可能是一个打字错误。没错。
在C中,我们对字符使用单引号'
,对于以"
字符终止的字符数组的字符串使用'\0'
双引号。
因此,您必须将'aaanc6400'
替换为"aaanc6400"
并使用strcmp
。记得! fgets
也可以阅读\n
,因此您也可以将输入与"aaanc6400"
和"aaanc6400\n"
进行比较。这个解决方案足以满足学生项目的需要。
答案 1 :(得分:3)
您无法将字符指针与字符串文字进行比较。
你应该做的是:
if (strcmp(pass, "aaanc6400") == 0)
{ ... }
答案 2 :(得分:3)
你需要:
char pass[50] = "";
\n
fgets
移除pass[strlen(pass) - 1] = '\0';
(fgets
之后) - 这有助于您稍后比较字符串。if (pass != 'aaanc6400')
这个是完全错误的。使用strcmp
进行字符串比较,使用双引号进行字符串"aaanc6400"
来自@chux:最好使用strcspn
代替strlen
来修剪\n
<{1}} {/ 1}}
fgets
答案 3 :(得分:1)
verification
功能中的多个问题:
'aaanc6400'
是一个多字符字符常量,是一种不能移植使用的过时结构。您可能想要将用户读取的字符串与字符串"aaanc6400"
进行比较:您应该使用strcmp()
。
您应该检查fgets()
的返回值:在文件末尾或读取错误时,它返回NULL
并且数组内容是不确定的。
如果出现错误,您应该使用循环而不是递归。
以下是更正后的版本:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void verification(void) {
char pass[50];
printf(" Enter Password: ");
for (;;) {
fflush(stdout);
if (fgets(pass, 50, stdin) == NULL) {
printf("unexpected end of file\n");
exit(1);
}
pass[strcspn(span, "\n")] = '\0'; // remove the newline if present
if (strcmp(pass, "aaanc6400") == 0) {
// correct password, stop prompting.
break;
}
printf("\n Invalid Password. Please enter the correct password: ");
}
info();
}