在C89 / C90中解析字符串

问题描述 投票:0回答:2

所以我想将字符串解析为变量,而我几乎拥有了我想要的东西。

所以我有这样的字符串

char [128] = "D4 E 3 NullByte Sub";

然后我想将其分为4个变量。

因此,D4将是位置,E将是方向。 3是长度,而NullByte Sub是名称。

到目前为止,我一直在使用sscanf来使用它拆分为变量。 (假设变量已经创建。)

sscanf(line, "%s %s %d %s", location, direction, &length, name);

因此这会正确扫描位置,方向和长度,但会切掉名称的Sub部分。我想知道如何忽略其他任何空格,并阅读剩下的内容。不管有多少空格等等。

So if line = "D4 E 3 NullByte Sub Ship Barrier"
Then I could expect the name to be 
"NullByte Sub Ship Barrier"

谢谢您的帮助。

c string parsing scanf c89
2个回答
0
投票

喜欢这个:

int offset;
sscanf(line, "%s %s %d %n", location, direction, &length, &offset);
name = line + offset; // or strncpy or something, if you want a new string instead of just a pointer into the old one

%n记录到目前为止已消耗了多少个字符。如果向前跳那么多字符,那么您将获得字符串的其余部分。

旁注:在没有最大字段宽度的情况下使用%s(或让其与m修饰符一起分配)是危险的,除非您100%确保不会收到过长的单词。


0
投票

问题在于,%sscanf格式(以及相关功能,例如scanf)读取了空格分隔字符串。

由于字符串中没有好的“记录结束”标记(超出字符串的实际结尾,所以即使使用特殊的sscanf格式说明符,也很难使用sscanf

相反,我建议您学习%[以及如何使用它“标记”字符串。

有了它,您可以做类似的事情:

strtok
© www.soinside.com 2019 - 2024. All rights reserved.