繁体   English   中英

Getc()不正确地读取\\ n

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM