【问题标题】:Split a string of words and numbers and save some of its number elements c++拆分一串单词和数字并保存它的一些数字元素c ++
【发布时间】:2014-03-12 02:42:00
【问题描述】:

我想找到一种方法来拆分由数字 (int) 和单词组成的字符串,并保存其中的一些元素。 例如,我有字符串(保存在变量“row”中: “ 1 120 130 10 亲爱的_167 5” 我想在向量 v 中保存 120 130 10 和 5.. 我写了一段代码如:

int elements;
istringstream line_stream(row);

line_stream>>elements>>elements; //to skip the first number of row, 1
v[0]=elements; //so I save 120 in v[0]
line_stream>>elements;
v[1]=elements; //so I save 130 in v[1]
line_stream>>elements;
v[2]=elements; //so I save 10 in v[2]
line_stream>>elements>>elements;
v[3]=elements; //to save 5 in v[3]

我的问题是在 v[3] 中我发现 0.. 我认为这是因为我的变量元素是一个 int 类型,但我现在被困在这个问题上,尽管它可能并不难解决。

谢谢

【问题讨论】:

  • 您是否已经调整了矢量的大小? v[3] 不创建一个元素,它分配给一个已经存在的元素......所以如果它不存在,你将分配给一个任意的内存位置。尝试将v[3] 替换为v.at(3) 并查看它是否引发异常。我投票结束这个问题,因为您没有提供足够的信息来说明正在发生的事情。
  • 你应该试试看strtok;可能会使您的实施更容易
  • @MrDuk,天哪,不! strtok 是可憎的,Boost.Tokenizer 会更好
  • 作为一个从事我无法轻松实现第三方库的项目的人,您介意为我详细说明一下吗?怎么样让它成为一个“可憎的”?
  • @MrDuk,它有一个容易出错的接口,它依赖于静态存储,它会破坏它的输入。更不用说它适用于char*,这使得与std::string一起使用很不方便。

标签: c++ string


【解决方案1】:
line_stream>>elements;
v[1]=elements; //so I save 130 in v[1]

更简单的方法是:

line_stream >> v[1];

但是,假设 v[1] 处的元素已经存在,如果不存在,则需要先调整向量的大小。

line_stream>>elements>>elements;

如果流中的单词是Dear_1675,这将不起作用,因为无法将其读入int,因此流将进入失败状态,您将无法从中读取任何其他内容它。忽略读入string 的任意(非整数)单词。

这应该做你想做的:

std::string ignore;
std::istringstream line_stream(row);
v.resize(4);    
line_stream >> ignore >> v[0] >> v[1] >> v[2] >> ignore >> v[3];

您还应该检查错误(如果您这样做了,您会发现流在您自己的代码中失败):

std::string ignore;
std::istringstream line_stream(row);
v.resize(4);    
if (line_stream >> ignore >> v[0] >> v[1] >> v[2] >> ignore >> v[3])
{
  // read everything OK
}
else
{
  // row could not be read, did not match expected format
}

【讨论】:

  • 非常感谢乔纳森!我打算这样试试,我觉得是对的! :)
猜你喜欢
  • 2021-10-13
  • 2016-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-02
  • 2020-03-01
  • 2020-10-16
  • 2021-09-10
相关资源
最近更新 更多