c - 如何使 sscanf 强制特定格式?

标签 c format scanf

我有以下表示复数的格式:#define FROM_CHAR_FORMAT "%lf,%lfi"

我有以下 sscan 命令:

int sscanfRetVal = sscanf(s, FROM_CHAR_FORMAT, &complexPtr->re, &complexPtr->im);

事实证明,即使字符串 s 包含类似“1,1”(没有 i)的内容,sscanf 也会从中提取 double 值。

我如何强制它检查第二个数字后面是否有“i”?

最佳答案

一个简单的方法是使用 "%n" 检测扫描是否进行到那么远。

"%n" 导致 sscanf() 保存扫描中那个点的扫描偏移量 - 如果它到达那么远。

#define FROM_CHAR_FORMAT "%lf,%lfi"

int n = -1;
sscanf(s, FROM_CHAR_FORMAT " %n", &complexPtr->re, &complexPtr->im, &n);
if (n >= 0 && s[n] == '\0') Success();
else Failure();

此代码使用 "%n" 而不是 "%n" 以允许可选的尾随空格,如 '\n'

注意:"%n" 不影响 sscanf() 的返回值。

注意:考虑 "%lf ,%lfi", 之前允许空格。

可以使用多个"%n"

int n1 = -1;
int n2 = -1;
sscanf(s, "%lf %n,%lfi %n", &complexPtr->re, &n1, &complexPtr->im, &n2);
if (n1 >= 0 && s[n1] == '\0') { complexPtr->im = 0.0; Success_Real(); }
else if (n2 >= 0 && s[n2] == '\0') Success_Complex();
else Failure();

关于c - 如何使 sscanf 强制特定格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41127862/

相关文章:

c - seccomp 如何处理 ptrace 事件

string - 如何在 Golang 中将映射解压缩为字符串格式的关键字参数?

c - 没有输入时如何在scanf()中检测?

wpf - 我总是需要为日期格式编写转换器吗?

C 尝试检查无效输入

c - 是否有 sscanf 的变体,它带有指向输入字符串而不是缓冲区的指针?

java - 滚动 Pane 如何滚动

c - GTK+ 将字体更改为旋转按钮

C - 小数字的浮点舍入

具有 6 位微秒/毫秒的 java 日期格式