所以我有一个while循环来读取文本文件中的注释,如下所示。评论后可能会有事情,所以不应该排除。这是我的代码如下:
int i = 0;
while(!feof(fd) || i < 100) {
fscanf(fd, "#%s\n", myFile->comments[i]);
printf("#%s\n", myFile->comments[i]);
getch();
i++;
}
评论格式:
# This is a comment
# This is another comment
知道为什么只返回第一个字符?
修改
这是我的评论数组:
char comments [256][100];
答案 0 :(得分:1)
comments数组允许256个字符串,每个字符串最多100个字符
扫描集" %99[^\n]"
将跳过前导空格并扫描最多99个(以允许终止'\ 0')字符或换行符中的换行符。
if条件将打印该行并在注释行上增加i
。
int i = 0;
char comments[256][100];
while( i < 256 && ( fscanf(fd, " %99[^\n]", comments[i]) == 1)) {
if ( comments[i][0] == '#') {
printf("%s\n", comments[i]);
i++;
}
}
答案 1 :(得分:0)
因为scanf
%s
会在' '
或'\n'
或EOF
之前读取。使用类似fgets
的内容。
答案 2 :(得分:0)
"%s"
不会节省空格。
它会读取并丢弃前导空格,然后将非空白空间保存到myFile->comments[i]
// reads "# This ", saving "This" into myFile->comments[i]
fscanf(fd, "#%s\n", myFile->comments[i]);
// Prints "This"
printf("#%s\n", myFile->comments[i]);
// reads and tosses "i"
getch();
// next fails to read "s a comment" as it does not begin with `#`
// nothing saved in myFile->comments[i]
fscanf(fd, "#%s\n", myFile->comments[i]);
// output undefined.
printf("#%s\n", myFile->comments[i]);
相反,请避免scanf()
。要阅读一行输入,请使用fgets()
char buf[100];
while (fgets(buf, sizeof buf, stdin)) {
if (buf[0] == '#') printf("Comment %s", &buf[1]);
else printf("Not comment %s", buf);
}