这与 sscanf usage - how to verify a completed scan vs an aborted scan 有关但这是该问题未涵盖的边缘案例。
char entry[] = "V2X_3_accepted";
int d1,d2,ret1,ret2;
ret1 = sscanf(entry,"V2X_%d_expected",&d1);
ret2 = sscanf(entry,"V2X_%d_received",&d2);
预期结果:ret1==0; ret2==0; d1, d2
未定义。
实际结果:ret1==1; ret2==1; d1=d2=3
.
在末尾使用 %n
无济于事,因为匹配字符串的长度相等。是否有一些巧妙的技巧可以在不执行连续的 strncmp 或类似操作的情况下匹配尾随文本?
最佳答案
使用 "%n"
工作正常。 @user3121023
建议使用 "%n"
允许可选的尾随空格,如 '\n'
传递 "V2X_3_expected\n"
并检查 %n
结果是否失败 "V2X_3_expected 123"
。
char entry[] = "V2X_3_accepted";
int d1,d2;
int n1 = 0;
int n2 = 0;
sscanf(entry,"V2X_%d_expected %n",&d1, &n1);
sscanf(entry,"V2X_%d_received %n",&d2, &n2);
if (n1 > 0 && entry[n1] == '\0') Success_expected(d1);
else if (n2 > 0 && entry[n2] == '\0') Success_received(d2);
else Fail(entry);
将 n1
初始化为扫描到达 "%n"
说明符时永远不会设置的值。 n1 = 0;
在大多数情况下效果很好,例如使用 OP 的格式 "V2X_%d_ ..."
。
n1 = -1;/* and (n1 >= 0 */
也适用于像 "%n"
这样的短格式。
关于c - 匹配 sscanf 中的尾随文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41221639/