使用C中的fgets读取固定数量的字符

时间:2013-07-30 20:35:04

标签: c stdin fgets

我正在尝试使用C中的函数fgets()读取8个字符,并且必须是stdin的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)但两者都没有。

提前致谢。

5 个答案:

答案 0 :(得分:3)

从手册页:

  

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

你只读七个字。

答案 1 :(得分:1)

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

你真正想问的是字符串中第一个8之前的八个字符是否都是非零的。您可以致电'\0'

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

'\0'

答案 2 :(得分:0)

这就是原因:

fgets()从流中读取最多一个小于大小的字符,并将它们存储到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");
  }
}

答案 3 :(得分: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循环的中间添加一个检查以获得FILE结尾字符,如果输入包含少于8个字符,则可以使程序做出相应的响应。

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

答案 4 :(得分:0)

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

  1. 在第9个位置检查\ 0。
  2. 将\ n的第8位替换为\ 0,然后检查第8位的\ 0。