我有以下表示复数的格式:#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/