C - fgets和stdin的长度

时间:2012-10-04 14:58:32

标签: c string fgets

我用C编写了一个程序,让用户输入密码让他进入系统。我正在使用fgets方法。正确的密码是“letmein”。这是代码:

现在我要验证用户通过stdin输入的密码不超过8个字符。由于程序是(没有空的if语句),即使用户输入“letmein0000000”,用户也被授予访问权限,因为fgets只提取了前7个字符。现在我只想在用户输入“letmein”时授予用户访问权限。怎么可以这样做?

P.S。我必须使用fgets,因为它是我项目中的一项要求。

1 个答案:

答案 0 :(得分:6)

来自fgets()的文档:

  

最多读取计数 - 给定文件流中的1个字符并将它们存储在str中。生成的字符串始终以NULL结尾。如果发生文件结束或找到换行符,则解析将停止,在这种情况下,str将包含该换行符。

请求读取最多8个字符(这意味着将9作为第二个参数传递)。如果用户输入超过7个字符,则可以捕获它。告知用户失败并跳过stdin中剩余的内容。如果用户正确输入7并且点击返回fgets()将停止在换行符处。

检查fgets()的返回值,以确保代码不会尝试处理单位化缓冲区。

例如:

char password[9];

if (fgets(password, 9, stdin))
{
    /* Strip new-line if present. */
    char* nl = strchr(password, '\n');
    if (nl) *nl = 0;

    if (strlen(password) > 7)
    {
        /* Password too long. 
           Skip remaining input if necessary. */
        int c;
        while ((c = fgetc(stdin)) != EOF && c != '\n');
    }
    else if (0 == strcmp("letmein", password))
    {
        /* Good password. */
    }
    else
    {
        /* Incorrect password. */
    }
}