是否允许使用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功能是根据本节定义的.
要添加到其他答案,以下所有内容均有效:
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)
该联机帮助页说:
格式字符串由一系列指令组成
...
指令是以下之一:
•一系列空格字符(空格,制表符,换行符等;请参阅isspace(3)).该指令在输入中匹配任意数量的空白,包括无空格.
...
所以是的,它是scanf的合法用途.
如果你追求效率:
int c;
while(isspace(c=getchar()) {;}
Run Code Online (Sandbox Code Playgroud)
如getchar等,导致更有效的路径.人.与之_unlocked不同的是,往往有同行scanf.