這是我的代碼。這是一個學校專案,我們不允許使用 fopen,只是為了讓你知道。我想將文本檔案讀入字串,但沒有讀取最后一行。我想我知道為什么,正如我所說,每當 c == '\n' 它列印一個新行,但最后一行的末尾有 '\0' 。我只是不知道如何修復它。
#include <stdio.h>
struct contact
{
char name[100];
int number[100];
};
void read_lines()
{
char line[100];
char c;
int i = 0;
while ( (c = getchar()) != EOF)
{
if ( c == '\n')
{
printf("%s", line);
for (int j = 0; line[j] != '\0'; j )
{
line[j] = '\0';
}
i = 0;
}
line[i] = c;
i ;
}
}
int main(int argc, char *argv[])
{
read_lines();
return 0;
}
這是文本檔案:
Mark Brown
6846516516
Jane Black
6848489468
John White
8526848654
uj5u.com熱心網友回復:
您必須使用int變數才能有意義地比較EOF.
此外,您需要觸發最后一行的輸出,該行沒有尾隨換行符,您的代碼當前僅在其上觸發。
要解決這個問題,請確保輸出也可以由EOF.
即使用后檢查do-while并將條件更改為也輸出,EOF然后在回圈的最后一次迭代中可用。
void read_lines()
{
char line[100];
int c;
int i = 0;
do
{
c = getchar();
if ((c == '\n')||(c==EOF))
{
printf("%s", line);
for (int j = 0; line[j] != '\0'; j )
{
line[j] = '\0';
}
i = 0;
}
line[i] = c;
i ;
} while ( c != EOF) ;
}
我希望輸出是您問題的正確再現:
Mark Brown
6846516516
Jane Black
6848489468
John White
8526848654
uj5u.com熱心網友回復:
我懷疑你的問題不是關于閱讀最后一行,而是你的程式的輸出不包含最后的換行符。如果這種解釋是正確的,它很容易修復。只需在每行的末尾而不是在下一行的開頭寫下換行符。例如:
int c;
char line[100];
while( (c = getchar()) != EOF && i < sizeof line - 1 ){
line[i ] = c;
if( c == '\n' ){
line[i] = '\0';
fputs(line, stdout);
i = 0;
}
}
請注意,這仍然不能很好地處理長行,但可以解決所宣告的問題(如果我正確解釋了所宣告的問題!)。
另請注意,我已經更改了c. 回傳的值getchar是a ,如果要準確地區分 EOF 和檔案中的有效資料,則int不能將其分配給 a 。char
還要注意對i. 文本檔案中的行很容易超過 100 個字符,當這種情況發生時,您的程式不應出現例外行為。(盡管有人可能會爭辯說,簡單地在長行上終止回圈是“行為不端”,但它并沒有溢位陣列的邊界那么糟糕。)
uj5u.com熱心網友回復:
getchar因為它從標準輸入中讀取,所以對您的專案沒有用處stdin。
你應該看看這個read函式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/518359.html
標籤:C
上一篇:從C中的無符號字符中檢索多個值
