簡體   English   中英

使用fprintf導致的無限循環

[英]infinite loop caused using fprintf

我正在嘗試將用戶輸入的字符串打印到文件中(作為字符),並在到達用戶輸入末尾時停止打印。 當我運行代碼時,似乎創建了一個無限循環,並且大量的被打印到文件中。 我不知道怎么了。

這是代碼:

     printf("Please input a character string, no spaces: \n\n");
     scanf("%c", &c);  //assigns user input to c var
     while ((c >= '0') && (c <= '9')) { //check char is an integer
         fprintf(f, "%c", &c);

         if (c == 0x0A) {
             fprintf(f, "\n\n");
             fclose(f);
         }
     }  

這是輸出文件的圖像: File1.txt

首先,學習如何以可靠,簡單的方式讀取字符串。 在閱讀字符串和學習使用fgets時,幾乎在所有情況下都不要使用scanf 其次,您的基本問題是您正在讀取一個字符,然后在該字符上無休止地循環。 您沒有讀過字符串,並且您檢查或輸出的內容永遠不會超過輸入的第一個字符。

嘗試這樣的事情:

char str[129];
printf("Please input a character string, no spaces: \n\n");
fgets(str, sizeof(str), stdin);
size_t len = strlen(str);
for (size_t i = 0; i < len; i++)
{
    char c = str[i];
    if(c == 0x0A)
        break;

    if (c >= '0') && (c <= '9')) //check char is an integer
        fprintf(f, "%c", c);
}
fprintf(f, "\n\n");
fclose(f);

我沒有添加任何錯誤檢查。 您至少需要確保fgets成功。

您有一個無限循環,因為您沒有在while循環中修改c變量,因此條件總是計算為相同的值...

此外,您不打印字符:您傳遞c地址而不是其value 這將調用未定義的行為,因為地址不適用於%c轉換說明符。

這是更正的版本:

    printf("Please input a character string, no spaces:\n\n");
    c = 0;
    while (scanf("%c", &c) == 1 && (c >= '0') && (c <= '9')) {
        fprintf(f, "%c", c);
    }
    if (c == '\n') {
        fprintf(f, "\n\n");
        fclose(f);
    }

但是請注意,如果不讀取換行符,則不存儲讀取的字符,也不對文件進行fclose() 您的邏輯似乎壞了。 使用fgets()讀取整行並掃描輸入以進行驗證和進一步處理會更簡單。

    char line[80];
    if (fgets(line, sizeof line, stdin)) {
        int digits = strspn(line, "0123456789");
        if (digits > 0 && line[digits] == '\n') {
            fprintf(f, "%.*s", digits, line);  // output the digits
            // handle the value read?
        } else {
            // handle incorrect input
        }
    } else {
        // handle premature end of file
    }
    fclose(f);

暫無
暫無

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

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