我有一个字符串,其中包含由 | 分隔的信息字符,我需要为每条信息创建子字符串。此外,某些字段可能为空。
值的顺序为名字|姓氏|年龄|IDNumber|高度|体重
所以可能的字符串可能是:
char* strA = "约翰|多伊|50|123456|70|150"; char* strB = "詹姆斯|史密斯|40|345678||";
我可以使用 sscanf 很好地提取第一个字段,但是当我尝试获取多个字段时,我得到了错误的值。
为了获得第一个值,我可以调用
char* strA = "John|Doe|50|123456|70|150";
char* a, b;
sscanf(strA, "%[^|]|", &a);
printf("%s\n", &a);
打印 约翰 但是当我尝试通过调用
获取前 2 个字段时char* strA = "John|Doe|50|123456|70|150";
char* a, b;
sscanf(strA, "%[^|]|%[^|]|", &a, &b);
printf("%s | %s\n", &a, &b);
打印出来
oe |美国能源部
我不明白这是为什么。
最佳答案
您的指针设置错误。使用动态或自动分配。此外,您对 sscanf
格式 %[^|]
的参数同样是错误的。这需要一个 char*
并在 &a
情况下传递一个 char**
,以及一个指向 char
的简单指针> (一)在 &b
情况下。 两者都应该指的是足以消耗您的输入的内存。
示例(使用自动存储)
const char* strA = "John|Doe|50|123456|70|150";
char a[32], b[32];
sscanf(strA, "%31[^|]|%31[^|]|", a, b);
printf("%s | %s\n", a, b);
坦率地说,几乎所有有值(value)的现代工具链都应该警告您发送到 scanf
和 printf
的不正确类型。调出警告和/或使用本世纪开发的工具链。
关于无法解析 | 之间的子字符串C语言中的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58381584/