文件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有正确的方法,只是不确定如何使用。
答案 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;
}