c - 如何检测是否有新行然后忽略它(fgets)

标签 c

#include <stdio.h>
#include <string.h>

int main(int argc, char **argv) {

    FILE *file = fopen(argv[1], "r");
    char buf[100];
    char *pos;
    while (fgets(buf, sizeof(buf), file)) {
        if ((pos=strchr(buf, '\n')) != NULL)
            *pos = '\0';
        printf("%s\n", buf);

    }

}

假设我有一个如下所示的文件

a

b

c

如何检测是否有新行并忽略它然后继续 while 循环。例如,

$ gcc -Wall above.c
$ ./a.out file
a
b
c

如您所见,它忽略了新行。

最佳答案

如果输入中有换行符,fgets() 会停止并将其包含在缓冲区中。您无需使用 strchr() 搜索它,因为它始终位于 strlen() - 1(如果存在)。同样,空行意味着位置 0\n,在这种情况下您可以跳过它:

#include <stdio.h>
#include <string.h>

int main(int argc, char **argv) {
    FILE *file = fopen(argv[1], "r");
    char buf[100];
    size_t len;

    while (fgets(buf, sizeof(buf), file)) {
        if (buf[(len = strlen(buf)) - 1] == '\n')
            buf[len - 1] = 0;
        if (len > 1)
            printf("%s\n", buf);

    }

}

关于c - 如何检测是否有新行然后忽略它(fgets),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49400945/

相关文章:

c++ - 类型 "void *"的值不能分配给类型 "RANDOMSTRUCT *"的实体

android - lsetfilecon失败:传输端点上不支持该操作

c++ - 设置 MINMAXINFO 在 X 上偏移 4 像素,在 Y 上偏移 5 像素

c - 在 dev C++ 中使用 libcurl 几乎解决了我的问题,这是最后一个障碍。 (缺少 libcurl.dll)

c - 如何删除相同的数字并移动数组以在c中删除它们

c - 您将如何使用带有 3 个二进制输入组合的 switch 语句? (C)

c - 获取之前的adt列表

文件中的回车符

c - 内存不足故障处理方法

c - fscanf 在行中间找到空白字段后无法正常工作