fgets()读取的字符少于预期

时间:2017-02-25 21:25:36

标签: c

我创建了一个接受char指针的函数。我首先从fgets获取字符串值,我输入的输入是“rwx”。当我输入该值时,它的strlen表示它的长度为2,当我查看char数组的第一个索引时,它返回rw而不是r。我可以问一下,我在迭代字符串时出错了吗?

我尝试了什么:

int main()
{
    char  access[3];

    while (ValidateAccess(access))
    {
        printf("Please enter your access\n");
        fgets (access, 3, stdin);
    }
    return 0;
}

int ValidateAccess(char * access)
{
    int length = strlen(access);
    int r = 0,w = 0,x = 0,i;

    printf("this is the length %d\n", length);

    if (length == 0)
        return 1;

    for(i = 0; i < length; i++)
    {
        printf("this is the character: %s", &access[i]);

        if (strcmp(&access[i], "r") == 0)
            r++;
        else if (strcmp(&access[i], "w") == 0)
            w++;
        else if (strcmp(&access[i], "x") == 0)
            x++;
    }

    if (r <=1 && w <= 1 && x <= 1 )
        return 0;
    else
        return 1;
}

程序运行时这是输出

"this is the length 0"
Please enter your access
rwx
this is the length 2
this is the character: rw

1 个答案:

答案 0 :(得分:2)

man fgets是非常有用的阅读材料。让我引用一下:“fgets()从流中读取最多一个小于字符的字符......”

C中的字符串应以\0(零字节)终止。当您将access定义为包含3个元素的数组时,它有一个长度为2的字符串的空间 - 两个字符加上终止零字节。当你调用fgets表示你有3个字节的空间时,它会读取两个字符,将它们放在前两个字节中,并在第三个字节中放置终止值。

定义access a有4个字节,并将4传递给fgets

此外,您正在打印字符串而不是 char ,因此它会将所有内容打印到终止零字节(即您看到的rw来自的位置)。如果要打印单个字符,请在格式字符串中使用%c,而不是%s(并且您应该传递一个字符,而不是指针)。

尝试以下程序并确保您了解输出。

#include <stdio.h>

int main() {
        char *foo = "barbaz";

        printf("%c\n", foo[2]);
        printf("%s\n", foo + 2);
}