scanf在C中没有附加参数

时间:2016-02-11 17:50:01

标签: 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;
}

4 个答案:

答案 0 :(得分:13)

根据scanf()函数(*)的定义,强调我的:

  

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

[...]

  

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

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

(*):ISO / IEC 9899:1999,7.19.6.2 fscanf函数,第3节和第5节。

其他*scanf函数是根据本节定义的。

答案 1 :(得分: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

答案 2 :(得分:5)

manpage说:

  

格式字符串由一系列指令

组成

...

  

指令是以下之一:

     

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

...

所以,这是scanf的合法使用。

如果您追求效率:

int c;
while(isspace(c=getchar()) {;}

引领一条更有效的道路,如getchar等。人。与_unlocked不同,往往有scanf个对等人。

答案 3 :(得分:4)

我会尝试:

int skip = -1;
if (scanf(" %n", &skip)>=0 && skip>0)   {
  // you have skipped skip spaces
}

> = 0测试检查scanf没有失败(例如由于stdin上的EOF或输入错误)。 skip>0测试检查我们是否跳过了至少一个类似空格的字节。 %n转换说明符给出了已解析的字节数。