如何使sscanf强制特定格式?

时间:2016-12-13 18:12:19

标签: 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也会从中提取双打。

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

1 个答案:

答案 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();