[英]Read a fixed amount of characters using fgets in C
我試圖在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),但都不使用。
提前致謝。
從手冊頁:
fgets()最多從流中讀取小於大小的字符,並將它們存儲到s所指向的緩沖區中。 在EOF或換行符之后停止讀取。 如果讀取換行符,則將其存儲到緩沖區中。 終止空字節(aq \\ 0aq)存儲在緩沖區中的最后一個字符之后。
您僅讀取七個字符。
之所以不起作用的原因之一是因為您讀取的字符數少於八個。 說,用戶輸入三個字符,然后按[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");
}
}
這就是為什么:
fgets()最多從流中讀取小於大小的字符,並將它們存儲到s所指向的緩沖區中。 在EOF或換行符之后停止讀取。 如果讀取換行符,則將其存儲到緩沖區中。 終止空字節(aq \\ 0aq)存儲在緩沖區中的最后一個字符之后。
這意味着,如果您要讀取8,則實際上只讀取7。要讀取9,請使用大小為9的緩沖區,並從末尾開始檢查是否有任何值為null。
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");
}
}
如果您只想從標准輸入中讀取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
條件。
fgets()在您的情況下將\\ n存儲在第8個位置。
因此,您有兩個選擇,
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.