scanf函数的特性
我们知道,scanf函数用于从标准输入获取格式化数据。scanf家族中除了scanf本身外,还有fscanf/sscanf,分别对应从文件/字符串读取格式化数据,另外以v开头的是相应的不定参数版本。这些函数的表现行为类似,下面以scanf为例说几个不常用的特点。
1. 函数有返回值
scanf根据格式化参数从标准输入中读取数据:
- 如果发生错误(如没有输入数据),则返回EOF;
- 否则返回成功匹配并读取的字段的个数(可以为0);
2. 匹配失败时立即返回
format参数可包含下列内容:
- 空白字符:它们与输入中的零个或多个空白字符匹配,在处理过程中将被忽略。
- 格式代码:它们指定如何解释接下来的输入字符。
- 其他字符:当任何其他字符出现在格式化参数中时,下一个输入字符必须与它匹配。如果匹配,该输入字符随后就被丢弃;否则函数就不再读取而是直接返回。
3. 格式化字符串支持正则
- 集合:%[a-z], %[^abc], %*[^@.]
- 数量:%3s, %2d
注意:格式化字符串中的数量限制的含义是读取的最长长度,如果输入不够则按输入长度来。
例子:按行读取数据后原样输出,注意忽略空行,每行长度不超过50字节。
char buf[64];
int ret;
for (;;) {
ret = scanf("%[^\n]%*c", buf);
if (EOF == ret) /* no more data */
break;
if (0 == ret) { /* blank line */
fgets(buf, sizeof(buf), stdin); /* fetch the linefeed */
continue;
}
printf("%s\n", buf);
}