我尝试使用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),但都没有。
提前谢谢。
发布于 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");
}
}
发布于 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");
}
}
发布于 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
条件。
https://stackoverflow.com/questions/17956844
复制相似问题