我正在创建一个程序,打印一个文件的每一行一个字的顺序。即“大黑驼鹿”印为“驼鹿黑大”。
但是,在下面的代码中,它没有打印行的最后一个字,在行中断之前没有分隔符。在这种情况下,分隔符被定义为任何空格字符,如空格或制表符。
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("|");
}发布于 2015-04-30 06:07:44
这是会发生的,因为当getc找到文件的末尾时,您不会进入循环。如果wasD为false,则缓冲区中将有一个未处理的单词。
您可以将EOF视为空白,并将终止条件放在循环的末尾:
do {
c = getc(file);
isD = (c == ' ' || c == '\t' || c == '\n' || c == EOF);
// ...
} while (c != EOF);这是可行的,因为只有当c不是分隔符时才使用它的值。(特殊值EOF在(无符号)字符的有效范围之外,不应插入字符串或打印。)
发布于 2015-04-30 04:30:26
stdout不会被刷新,因为您的上一个输出没有包含换行符.
更改这一行
printf(“x”);
至
printf(“\n”);
https://stackoverflow.com/questions/29958526
复制相似问题