我正在尝试使用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)但两者都没有。
提前致谢。
答案 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个位置。
所以,您有两个选择,