[英]Newline, EOF and feof() aren't acknowledged
我有一個功能,可以執行以下操作:
ssize_t headache(char **lineptr, size_t *n, FILE * stream)
{
if(lineptr != NULL)
{
free(*lineptr);
}
size_t len = 0,
last = 0;
char * buf = NULL;
int c;
do
{
last = len;
++len;
buf = realloc(buf,len);
c = fgetc(stream);
buf[last] = (char)c;
printf("%i\t%x\t%c\n", last, buf[last], buf[last]);
}
while(!feof(stream) || c != '\n');
*n = strlen(buf);
*lineptr = buf;
return len;
}
頭痛總是叫頭痛(&lineptr,&n,stream)在哪里
char * lineptr = NULL;
size_t n = 0;
FILE * stream;
do {} while(); 循環將永遠不會確認換行符或EOF,這意味着它將繼續在無窮大。 我不明白為什么它忽略了EOF和'\\ n'。 有人可以告訴我,我做錯了什么?
while(!feof(stream) || c != '\n');
將再次循環,除非兩個條件評估為false。 你想要在接收EOF
或\\n
時退出循環,所以應該使用&&
代替
while(!feof(stream) && c != '\n');
你的問題是
while(!feof(stream) || c != '\\n')
這是因為使用|| (或)你必須使兩個條件都為假,以便停止執行。 有些輸入會使你的while循環永遠不會結束。 this is a test input
而this is a test input\\n
。
如果您將此作為stdin運行作為您的file*
比較當您運行它時鍵入消息並按Enter鍵然后鍵入消息並按control-d(在終端中為EOF)
正如simonc所說,你需要&&運算符,它只需要一個條件為false就可以停止。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.