是否允许在没有其他参数的情况下使用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;
}
答案 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
转换说明符给出了已解析的字节数。