手册页指出签名sscanf
是
sscanf(const char *restrict s, const char *restrict format, ...);
Run Code Online (Sandbox Code Playgroud)
我在SO上看到了一个答案,其中一个函数sscanf
用于检查输入是否为整数.
bool is_int(char const* s) {
int n;
int i;
return sscanf(s, "%d %n", &i, &n) == 1 && !s[n];
}
Run Code Online (Sandbox Code Playgroud)
看着!s[n]
它似乎建议我们检查是否sscanf
扫描了字符序列,直到终止字符\0
.所以我假设n
代表索引,s
当函数结束时sscanf将在字符串中.
但是这个变量i
怎么样?这是什么意思?
编辑:
更明确一点:我看到签名需要sscanf
一个类型的指针char *
作为第一个参数.格式说明符作为seconf参数,因此它知道如何解析字符序列以及与下一个参数一样多的转换说明符变量.我现在明白这i
是为了保存解析的整数.
由于只有一个格式说明符,我试图推断出函数n
.
我的假设是n
正确的吗?
看起来op已经有了他的答案,但是因为我不好意思为自己查看并运行代码......
来自"C The Pocket Reference"(Herbert Shildt的第二版)scanf()部分:
%n接收一个等于当前读取的字符数的整数值
并为返回值:
scanf()函数返回一个数字,该数字等于成功分配值的字段数
sscanf()函数的工作方式相同,它只是从提供的缓冲区参数(在本例中为s)中输入."== 1"测试确保只解析了一个整数,并且!s [n]确保输入缓冲区在解析的整数之后完全终止和/或字符串中只有一个整数.
运行此代码时,类似"32"的s值会给出"true"值(我们没有将bool定义为我们系统上的类型)但s为"3 2"会给出"false"值,因为s [n]在这种情况下是"2"并且n具有值2(在这种情况下解析"3"以创建int).如果s为"3",则此函数仍将返回true,因为所有空白区域都被插入且n的值为3.
另一个示例输入"3m"给出了您所期望的"假"值.
sscanf()
的手册页逐字记录:
转换
[...]
n
没有什么可期待的;相反,到目前为止从输入消耗的字符数通过 next 指针存储,该指针必须是指向 int 的指针。这不是转换,尽管可以使用 * 赋值抑制字符来抑制它。C 标准说:“%n 指令的执行不会增加执行完成时返回的赋值计数”,但勘误表似乎与此相矛盾。也许明智的做法是不对 %n 转换对返回值的影响做出任何假设。
归档时间: |
|
查看次数: |
14113 次 |
最近记录: |