gpt4 book ai didi

c - Getc() 读取\n 不正确

转载 作者:行者123 更新时间:2023-11-30 15:20:32 24 4
gpt4 key购买 nike

我正在创建一个程序,以相反的字序逐行打印文件的每一行。即“The big black moose”打印为“moose black big The”。

但是,在下面的代码中,它不会打印换行符之前没有分隔符的行的最后一个单词。在这种情况下,分隔符被定义为任何空白字符,例如空格或制表符。

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 不是分隔符时才使用它的值。 (特殊值 EOF 超出了(无符号)字符的有效范围,不应插入字符串或打印。)

关于c - Getc() 读取\n 不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29958526/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com