[英]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.