首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在C++中使用fgets读取固定数量的字符

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

Stack Overflow用户
提问于 2013-07-31 04:35:04
回答 3查看 6.5K关注 0票数 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(十六进制)> 8),但都没有。

提前谢谢。

EN

回答 3

Stack Overflow用户

发布于 2013-07-31 04:39:44

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

您真正想要问的是字符串中第一个'\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");
  }
}
票数 1
EN

Stack Overflow用户

发布于 2013-07-31 04:43:34

这就是为什么:

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");
  }
}
票数 0
EN

Stack Overflow用户

发布于 2013-07-31 11:09:32

如果您只想从标准输入中读取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循环中间添加对文件结束字符的检查,可以使程序在输入少于8个字符时做出相应的响应。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17956844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档