如何从给定文件C中删除“#”符号

时间:2018-03-20 01:24:31

标签: c

文件1

:once:echo Hello # this is a comment
:once:echo 1
:once:echo 2
:once:echo 3
:once:echo 4

考虑上面的文件,如果我想逐个打印出每一行,我将如何删除“#this is a comment”和“:once:”

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

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

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


}

我想我可以使用strchr删除评论,但不确定如何解决这个问题。

我希望输出为此

$ gcc -Wall a.c
$ ./a.out file1
echo Hello
echo 1
echo 2
echo 3
echo 4

当前输出:

:once:echo Hello  # This is a comment

:once:echo 1

:once:echo 2

:once:echo 3

:once:echo 4

不确定为什么有额外的空间。我认为我对strchr有正确的方法,只是不确定如何使用。

2 个答案:

答案 0 :(得分:1)

您应该将char p;更改为char *p;,否则这根本不起作用。如果您仅在行的开头查找:once:,则可以使用strncmp()检查前六个字符,并在必要时偏移字符串的开头。

此外,由于fgets()会保留换行符,因此当您遇到\n符号时,也可以添加\0#,然后忽略\n 1}}打印每一行时。这样你的输出就不会有双重换行符。

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

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

    FILE *file = fopen(argv[1], "r");
    char buf[100];
    char *p;
    while (fgets(buf, sizeof(buf), file)) {
        if ((p = strchr(buf, '#'))) {
            *(p++) = '\n';
            *p = '\0';
        }
        printf("%s", buf + (strncmp(buf, ":once:", 6) == 0 ? 6 : 0));
    }
    fclose(file);
}

答案 1 :(得分:0)

这对你有用。我在for内添加了一个嵌套的while,以遍历buf并检查'#'哈希字符。您应始终确保检查是否存在必要的文件,而不是假设它存在。

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

int main(int argc, char **argv) {
    FILE *file;
    if (!(file = fopen(argv[1], "r"))) {
        fprintf(stderr, "The specified file does not exist\n");
        return 1;
    }
    char buf[100];
    int x;
    while (fgets(buf, sizeof(buf), file)) {
        for (x = 0; x < sizeof(buf); x++) {
            if (buf[x] == '#')
                buf[x] = '\0';
        }
        if (strncmp(buf, ":once:", 6) == 0)
            printf("%s\n", buf + 6);
        else
            printf("%s\n", buf);
    }
    fclose(file);
    return 0;
}