试图获取每一行,但只返回循环中的第一个字符

时间:2016-01-19 13:11:37

标签: c

所以我有一个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];

3 个答案:

答案 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);
}