scanf在C中没有附加参数

rax*_*ell 14 c scanf

是否允许使用scanf(" ")没有其他参数来忽略初始空格?
我正在getchar()阅读一个单词的字符,我想忽略单词之前的空格(后面用空格来检查单词的结尾).
代码如下,是否正确?

char *read_word() {
    int size = 2;
    int char_count = 0;
    char *s;
    char ch;

    s = mem_alloc(size);

    scanf(" ");

    while ((ch = getchar()) != EOF) {
        if (char_count >= size) {
            s = mem_realloc(s, size++);
        }

        if (ch == ' ' || ch == '\n') {
            s[char_count] = '\0';
            break;
        }

        s[char_count++] = ch;
    }

    return s;
}
Run Code Online (Sandbox Code Playgroud)

Dev*_*lar 13

scanf()函数的定义(*),重点是我的:

格式由零个或多个指令组成:一个或多个空格字符,普通的多字节字符(既不%是空格字符也不是空格字符)转换规范.

[...]

由白色空格字符组成的指令通过读取第一个非空白字符(仍然未读取)的输入来执行,或者直到不再能够读取字符为止.

所以scanf( " " );完全有效.


(*):ISO/IEC 9899:1999,7.19.6.2 fscanf功能,第3节和第5节.

其他*scanf功能是根据本节定义的.


dxi*_*xiv 9

要添加到其他答案,以下所有内容均有效:

scanf(" ");      // skip over whitespace
scanf("xyz");    // skip over the longest leading substring of "xyz" if present
                 // i.e. "xyz" or "xy" or "x"
scanf(" %*s ");  // skip over the first string and whitespace around it
Run Code Online (Sandbox Code Playgroud)

  • 感谢通过原始答案添加额外的知识 - 有帮助 (2认同)

PSk*_*cik 5

联机帮助页说:

格式字符串由一系列指令组成

...

指令是以下之一:

•一系列空格字符(空格,制表符,换行符等;请参阅isspace(3)).该指令在输入中匹配任意数量的空白,包括无空格.

...

所以是的,它是scanf的合法用途.


如果你追求效率:

int c;
while(isspace(c=getchar()) {;}
Run Code Online (Sandbox Code Playgroud)

如getchar等,导致更有效的路径.人.与之_unlocked不同的是,往往有同行scanf.