0

请看一下这个代码片段:

char line[80];
if(fscanf(stdin, "%*[\t\v\f ]%79[^\n]", line) != EOF)
        printf("%s\n", line);

输出:

$ gcc line.c -o line
$ ./line
 One space at the beginning.
One space at the beginning.
$ ./line
No space at the beginning.

$

现在如果No space at the beginning整个字符串没有按原样打印?

$ gcc --version
gcc (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3
4

3 回答 3

2

它失败是因为没有匹配到"%*[\t\v\f ]",所以后面的格式说明符%79[^\n]没有被处理,line也没有被分配。要跳过前导空格,请将扫描集替换为前导空格:

if(fscanf(stdin, " %79[^\n]", line) == 1)
    printf("%s\n", line);
于 2013-05-27T14:14:45.427 回答
0

scanf%*[\t\v\f ]如果行首没有空格、制表符或分页符,将在第一次匹配时失败。一旦失败,它将不会尝试匹配模式的其余部分。

此外,您不需要手动匹配这些字符,格式字符串中的一个空格将扩展为输入字符串中的任意数量的空格。请参阅文档isspace以检查哪些字符被视为空格。

于 2013-05-27T14:14:03.623 回答
0

如果没有找到@hmjd 解释的字段,您将在扫描退出时遇到麻烦。

注意:使用fgets()是一种更好的方法,但要坚持 OP 风格:

// consume select leading whitespaces, if any, but not \n
fscanf(stdin, "%*[\t\v\f ]");

// Scan non-eol chars
char line[80];
if (fscanf(stdin, "%79[^\n]", line) == 1) {
  printf("%s\n", line);
}

// scan a single EOL
char eol[2];
if (fscanf(stdin, "%1[\n]", eol) == 1) {
  ; // EOL found
}

通过分成 3 个fscanf()调用,依次尝试每种格式,即使之前的调用失败。

于 2014-07-02T05:06:10.263 回答