[英]Getc() reading \n improperly
我正在创建一个程序,以相反的单词顺序逐一打印文件的每一行。 即“大黑麋”打印为“大黑麋”。
但是,在下面的代码中,它不会在换行之前打印没有定界符的行的最后一个字。 在这种情况下,定界符定义为任何空格字符,例如空格或制表符。
int main(int argc, char const *argv[]) {
if (argc != 2) return 0;
int i = 0, c;
int isD = 0, wasD = 1;
int count = 0;
FILE *file = fopen(argv[1], "r");
while ((c = getc(file)) != EOF) {
isD = c == ' ' || c == '\t' || c == '\n';
if (!isD) {
chars[i++] = c;
count++;
}
if (isD && !wasD) {
shiftInsert(i++, count);
count = 0;
}
wasD = isD;
}
fclose(file);
return 0;
}
int shiftInsert(int length, int shift) {
int word[shift+1], i;
printf("\n----------\nL:%d,S:%d\n", length, shift);
for (i = 0; i < shift; i++)
word[i] = chars[length-shift+i];
word[shift] = ' ';
for (i = 0; i < shift; i++)
printf("%c", word[i]);
for (i = length; i >= 0; i--)
chars[i+shift+1] = chars[i];
for (i = 0; i <= shift; i++)
chars[i] = word[i];
printf("|");
}
发生这种情况是因为,当getc
找到文件结尾时,您不会进入循环。 如果wasD
为false,则缓冲区中将有一个未处理的单词。
您可以将EOF
视为空白,并将终止条件放在循环的末尾:
do {
c = getc(file);
isD = (c == ' ' || c == '\t' || c == '\n' || c == EOF);
// ...
} while (c != EOF);
这是可行的,因为仅当c
不是分隔符时才使用c
的值。 (特殊值EOF
超出了(无符号)字符的有效范围,因此不应插入字符串或进行打印。)
stdout没有刷新,因为您的最后一个输出不包含换行符...
更改此行
的printf( “|”);
至
的printf( “| \\ n”);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.