【问题标题】:Parsing a string into multiple strings将一个字符串解析为多个字符串
【发布时间】:2012-02-03 09:28:11
【问题描述】:

我必须将一个字符串分成几个。事实上,我需要的是从以下格式(i9、i9、i2)的文件中解析一些输入。

i9 表示十进制数: (5个空格)4567

所以我需要正确检索这些数字。宽度始终是固定的,因此每个数字都必须遵守这一点。 该格式的正确实例是

(5个空格)4567(6个空格)453(1个空格)2 或者 (5spaces)4567(6spaces)45322(在这种情况下,22 是 i2 的参数)

数字前的空格让我头疼,所以我想我可以将每个参数拆分为一个字符数组,然后将其转换为整数,因为 %d 说明符会忽略所有空格并且我不知道如何使用宽度以及忽略空格..(如果可以做到,我的意思是,将所有解析为整数请说出来!!)

如果没有.. 好吧,我需要帮助将每个字符串解析为子字符串,到目前为止我已经这样做了,但它不起作用:

while (fgets(buffer, 600, f)) {
    sscanf(buffer, "%9[^\n]s %9[^\n]s %2[^\n]s", arg1, arg2, arg3);
    ....
}

请,任何帮助将不胜感激!!!

【问题讨论】:

标签: c++ c string parsing


【解决方案1】:

这个答案是C。这就是我使用变量名new的原因。

使用strncpy() 并正确终止结果

char part1[10], part2[10], part3[3];
const char *new = "     4567      45322\n"; /* the line read */

strncpy(part1, new, 9);    part1[9] = 0;
strncpy(part2, new+9, 9);  part2[9] = 0;
strncpy(part3, new+18, 2); part3[2] = 0;

我建议你不要尝试编写多语言源文件。

【讨论】:

  • 哈哈,new 作为变量名是绊倒所有微软受害者的好方法 :-)
  • 谢谢大家的回答!!一切正常,除了以下情况: (2spaces)137411365101(3spaces)0.93 真正的格式是 i7 i7 f7 但是当它解析 0.93 它存储 (space)1(space)0.93 这是正确的(宽度 7)但它是文件中不是这样的(正如我在上面写的那样).. 1 个数字不应该在那里:S 请帮忙!
  • 哈哈!!复制代码以显示我理解并修复了我的错误!它就像一个魅力,谢谢大家! :)
【解决方案2】:

在 C++ 中,使用substr(),以及通常的字符串到整数的转换:

#include <string>

std::string s = "     1234      78922";

std::string s1 = s.substr(0, 9);
std::string s2 = s.substr(9, 9);
std::string s3 = s.substr(18);   // or substr(18, 2)

int n1 = std::stoi(s1), n2 = std::stoi(s2), n3 = std::stoi(s3);

在适当的地方应用通常的长度检查来验证输入确实是正确的格式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    • 2015-02-16
    • 1970-01-01
    相关资源
    最近更新 更多