c - 匹配 sscanf 中的尾随文本?

标签 c scanf

这与 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/

相关文章:

c - scanf() 无法正常工作?

c - 如何从 C 语言的文件中逐行读取每行两个字符串

c - 在 Linux(或 POSIX)中以只读方式重新打开文件

c - 如何在文件末尾添加数据

c - getpwnam 的奇怪行为

C++ 从字符串中获取小时和分钟

c++ - 如何使用 C++ 将 ASCII 文件的特定列存储(或转换)为数组?

c - 确定平均测验成绩的程序

c - OpenGL ES BlackBerry 10 2d 演练中 glMatrixMode() 和 glLoadIdentity() 的用途是什么

Vim make 使用 Quickfix 创建新文件 - Errorformat