我有以下格式来表示复数:#define FROM_CHAR_FORMAT "%lf,%lfi"
我有以下sscan命令:
int sscanfRetVal = sscanf(s, FROM_CHAR_FORMAT, &complexPtr->re, &complexPtr->im);
事实证明,即使字符串s
包含类似“1,1”(不含i)的内容,sscanf也会从中提取双打。
如何强制它检查第二个数字后面是否有“i”?
答案 0 :(得分:3)
一种简单的方法是检测扫描是否与"%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();