2

我正在尝试使用 C 中的函数 fgets() 来读取 8 个字符,并且必须是来自标准输入的 8 个字符。

到目前为止,我有这个

    char HEX[9];
    while (fgets(HEX, 8, stdin) != NULL)
    {
      if (HEX[8] == '\0')
      {
        printf("GOOD\n");
        break;
      }
      else
      {
        printf("Not 8 characters");
      }
    }

但它不起作用。有任何想法吗?也尝试使用 if (strlen(HEX) > 8) 但都没有。

提前致谢。

4

5 回答 5

3

从手册页:

fgets() 从流中最多读入一个小于 size 的字符,并将它们存储到 s 指向的缓冲区中。在 EOF 或换行符后停止读取。如果读取了换行符,则将其存储到缓冲区中。终止空字节 (aq\0aq) 存储在缓冲区中的最后一个字符之后。

您只阅读了七个字符。

于 2013-07-30T20:45:09.113 回答
1

这可能不起作用的一个原因是因为您阅读的字符可能少于八个。比如说,用户输入三个字符,然后按[Enter]。在这种情况下,charat 位置8将保持未分配,因此读取它将是未定义的行为。

您真正想问的是'\0'字符串中第一个字符之前的八个字符是否都非零。你可以通过调用来做到这一点strlen

请注意,当您传递长度时,您无法获得长度为 8 的字符串8,因为fgets将使用最后一个位置'\0'

char HEX[9];
while (fgets(HEX, 9, stdin) != NULL)
{ //              ^--- Pass 9, not 8
  if (strlen(HEX) == 8)
  {
    printf("GOOD\n");
    break;
  }
  else
  {
    printf("Not 8 characters");
  }
}
于 2013-07-30T20:39:44.187 回答
0

如果您只想从标准输入读取 8 个字符,函数 fgetc() 可能会更好地满足您的目的。

考虑以下代码:

#include <stdio.h>

int main(void)
{
    char str[8];
    int incre1=0;
    for (incre1=0;incre1<=7;incre1++) {
        str[incre1] = fgetc(stdin);
        if(str[incre1] == EOF) {
            printf("less than 8 characters\n");
            break; }
    }
printf("%s\n",str);
return(0);
}

此代码将从控制台或另一个程序的管道输出中读取标准输入(包括换行符)的前 8 个字符,并将它们放入str缓冲区。通过在for循环中间添加一个 End-of-FILE 字符的检查,您可以让您的程序在输入包含少于 8 个字符时做出相应的响应。

break请注意,如果您尝试使用交互式控制台输入编写程序,还可以在读取换行符时包含适当的条件。

于 2013-07-31T03:09:32.277 回答
0

这就是为什么:

fgets() 从流中最多读入一个小于 size 的字符,并将它们存储到 s 指向的缓冲区中。在 EOF 或换行符后停止读取。如果读取了换行符,则将其存储到缓冲区中。终止空字节 (aq\0aq) 存储在缓冲区中的最后一个字符之后。

这意味着如果你想读 8,你实际上只会读 7。你想读 9,有一个大小为 9 的缓冲区,并检查是否有任何值从末尾开始为空。

 char HEX[10];
 memset(hex, 1, 10); //Will stop false positives since memory might be null to begin with
while (fgets(HEX, 9, stdin) != NULL)
{
  if (HEX[9] == '\0')
  {
    printf("GOOD\n");
    break;
  }
  else
  {
    printf("Not 8 characters");
  }
}
于 2013-07-30T20:43:34.207 回答
0

fgets() 在您的情况下将 \n 存储在第 8 位。
所以,你有两个选择,

  1. 在第 9 位检查 \0。
  2. 将第 8 位的 \n 替换为 \0,然后检查第 8 位的 \0。
于 2019-05-27T18:26:32.773 回答