簡體   English   中英

在此示例中,我不了解fgets的行為

[英]I don't understand the behavior of fgets in this example

雖然我可以使用字符串,但我想了解為什么我正在處理的這個小示例會以這種方式運行,以及如何解決?

int ReadInput() {
    char buffer [5];
    printf("Number: ");
    fgets(buffer,5,stdin);
    return atoi(buffer);
}

void RunClient() {
    int number;
    int i = 5;
    while (i != 0) {
        number = ReadInput();
        printf("Number is: %d\n",number);
        i--;
    }
}

從理論上或者至少在我的腦海中,這應該讓我從輸入中讀取5個數字(盡管會覆蓋它們)。

但是事實並非如此,無論如何它都讀取為0。

我知道printf放置了\\ 0空終止符...但我仍然認為我應該能夠讀取第一個數字,而不僅僅是默認情況下為0。而且我不明白為什么其余的數字都可以(並非全為0)。

澄清:我只能讀取4/5數字,第一個始終為0。

編輯:

我已經測試過,看來這是引起問題的原因:

main.cpp中

scanf("%s",&cmd);
    if (strcmp(cmd, "client") == 0 || strcmp(cmd, "Client") == 0)
        RunClient();

不知何故。

編輯:

如果有人希望編譯,請參見以下代碼。 我仍然不知道如何解決

http://pastebin.com/8t8j63vj

最終編輯:

無法擺脫錯誤。 決定只添加@ReadInput

int ReadInput(BOOL check) {
    ...
    if (check) 
       printf ("Number: ");
    ...

@ RunClient()

void RunClient() {
    ...
    ReadInput(FALSE); // a pseudo - buffer flush. Not really but I ignore 
    while (...) {                    // line with garbage data
        number = ReadInput(TRUE);
        ...
    }

並稱之為一天。

fgets讀取輸入以及換行符。 因此,當您輸入數字時,就像: 123\\n

轉換失敗時atoi不會報告錯誤。

buffer刪除換行符:

buf[5];
size_t length = strlen(buffer);
buffer[length - 1]=0;

然后,使用strtol將字符串轉換為數字,以便在轉換失敗時更好地檢測錯誤。

char * fgets ( char * str, int num, FILE * stream );

從流中獲取字符串。

從流中讀取字符,並將它們作為C字符串存儲到str中,直到已讀取(num-1)個字符或到達換行符或到達文件末尾為止,以先發生的為准。

換行符使fgets停止讀取,但該函數將其視為有效字符並包含在復制到str的字符串中。 (這意味着您攜帶\\ n)

復制到str的字符后會自動附加一個終止的字符。 請注意,fgets與gets有很大的不同:fgets不僅接受流參數,還允許指定str的最大大小,並在字符串中包括任何結尾的換行符。

PD:嘗試使用更大的緩沖區。

暫無
暫無

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

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