其类型(fgets)的字符常量太长

时间:2016-11-14 12:17:46

标签: c arrays

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();
}

当我编译程序时,在标记的行上显示警告“字符常量对于其类型太长”以及“指针和整数之间的比较”。然后当我运行代码并输入正确的密码时,它仍会输出密码错误。我做错了什么?

4 个答案:

答案 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();
}