我正在创建一个程序,以反向字顺序逐个打印文件的每一行。即"大黑麋鹿"打印为"驼鹿黑色大"。
但是,在下面的代码中,它不会在换行符之前打印没有分隔符的行的最后一个单词。在这种情况下,分隔符被定义为任何空格字符,例如空格或制表符。
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("|");
}
答案 0 :(得分:1)
这种情况会发生,因为当getc
找到文件末尾时,您不会进入循环。如果wasD
为false,则缓冲区中会有一个未处理的单词。
您可以将EOF
视为空格,并将终止条件放在循环的末尾:
do {
c = getc(file);
isD = (c == ' ' || c == '\t' || c == '\n' || c == EOF);
// ...
} while (c != EOF);
这样可行,因为只有在c
不是分隔符时才使用EOF
的值。 (特殊值<xs:complexType name="getData"> (...) </xs:complexType>
超出(无符号)字符的有效范围,不应插入字符串或打印。)
答案 1 :(得分:0)
stdout没有被刷新,因为你的上一个输出不包含换行符......
更改此行
的printf( “|”);
到
的printf( “| \ n”);