【问题标题】:fgets() reads fewer characters than expectedfgets() 读取的字符少于预期
【发布时间】:2017-02-25 21:25:36
【问题描述】:

我创建了一个接收 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

【问题讨论】:

  • 最后一个字符是\0

标签: c


【解决方案1】:

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

C 中的字符串应以\0(零字节)结尾。当您将access 定义为一个由 3 个元素组成的数组时,它有一个空间来容纳长度为 2 的字符串——两个字符加上 终止零字节。当您调用fgets 说您有 3 个字节的空间时,它会读取两个字符,将它们放在前两个字节中,并将终止零放在第三个字节中。

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

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

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

#include <stdio.h>

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

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

【讨论】:

  • 嗨@avysk我刚试过这个,当我将访问权限更改为长度为4并且fgets得到4时,长度现在最多为3。但是现在对于索引0,我得到的输出是rwx,索引 1 我得到 wx,索引 2 我得到 x。它应该是 r 然后 w 然后 x。
  • @Master 因为您打印的是 string 而不是字符(%s 表示字符串)——它打印从给定字符到终止零字节的所有内容。如果要打印单个字符,则需要使用 %c 而不是 %s
  • @Master 我已经更新了答案,包括有关打印的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-09
  • 1970-01-01
  • 2022-11-17
  • 2018-05-28
  • 1970-01-01
  • 2017-02-11
  • 1970-01-01
相关资源
最近更新 更多