簡體   English   中英

使用C中的fget讀取固定數量的字符

[英]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] 在這種情況下,位置8char將保持未分配狀態,因此讀取它將是未定義的行為。

您真正要問的是字符串中第一個'\\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個位置。
因此,您有兩個選擇,

  1. 在第9個位置檢查\\ 0。
  2. 將\\ n在第8個位置替換為\\ 0,然后在第8個位置檢查\\ 0。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM