首页 > 解决方案 > 无法解析出 | 之间的子字符串 C中的字符

问题描述

我有一个字符串,其中包含由 | 分隔的信息 字符,我需要为每条信息创建子字符串。此外,某些字段可能为空白。

值的顺序为 FirstName|LastName|Age|IDNumber|Height|Weight

所以可能的字符串可能是:

char* strA = "约翰|Doe|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);

打印 John 但是当我尝试通过调用来获取前两个字段时

char* strA = "John|Doe|50|123456|70|150";
char* a, b;
sscanf(strA, "%[^|]|%[^|]|", &a, &b);
printf("%s | %s\n", &a, &b);

它打印 oe | Doe

我不知道为什么会这样。

标签: cstringscanf

解决方案


您的指针设置错误。使用动态或自动分配。sscanf此外,您对for format的论点%[^|]同样是错误的。这需要 achar*和您在案例中交付 a ,以及char**在案例中指向(one)&a的简单指针。两者都应该指的是有足够的内存来消耗您的输入。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);

坦率地说,几乎任何称职的现代工具链都应该警告您发送到scanfprintf. 打开你的警告和/或使用在这个千年开发的工具链。


推荐阅读