首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Getc()阅读不当\n

Getc()阅读不当\n
EN

Stack Overflow用户
提问于 2015-04-30 03:28:07
回答 2查看 267关注 0票数 0

我正在创建一个程序,打印一个文件的每一行一个字的顺序。即“大黑驼鹿”印为“驼鹿黑大”。

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

代码语言:javascript
复制
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("|");
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-30 06:07:44

这是会发生的,因为当getc找到文件的末尾时,您不会进入循环。如果wasD为false,则缓冲区中将有一个未处理的单词。

您可以将EOF视为空白,并将终止条件放在循环的末尾:

代码语言:javascript
复制
do {
    c = getc(file);
    isD = (c == ' ' || c == '\t' || c == '\n' || c == EOF);

    // ...

} while (c != EOF);

这是可行的,因为只有当c不是分隔符时才使用它的值。(特殊值EOF在(无符号)字符的有效范围之外,不应插入字符串或打印。)

票数 1
EN

Stack Overflow用户

发布于 2015-04-30 04:30:26

stdout不会被刷新,因为您的上一个输出没有包含换行符.

更改这一行

printf(“x”);

printf(“\n”);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29958526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档