Getc()阅读\ n不正确

时间:2015-04-30 03:28:07

标签: c

我正在创建一个程序,以反向字顺序逐个打印文件的每一行。即"大黑麋鹿"打印为"驼鹿黑色大"。

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

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("|");
}

2 个答案:

答案 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”);