【发布时间】:2010-12-11 22:41:24
【问题描述】:
这样你就可以做这样的事情,例如:
std::string a("01:22:42.18");
std::stringstream ss(a);
int h, m, s, f;
ss >> h >> m >> s >> f;
这通常需要将字符串格式化为"01 22 42 18"。
您可以直接修改当前语言环境来执行此操作吗?
【问题讨论】:
-
我猜你做不到。有趣的问题虽然 +1
这样你就可以做这样的事情,例如:
std::string a("01:22:42.18");
std::stringstream ss(a);
int h, m, s, f;
ss >> h >> m >> s >> f;
这通常需要将字符串格式化为"01 22 42 18"。
您可以直接修改当前语言环境来执行此操作吗?
【问题讨论】:
我不认为您可以在不创建新语言环境的情况下更改默认分隔符,但这似乎很老套。您可以使用 getline 和指定分隔符的第三个参数,或者您可以读取分隔符而不对它们做任何事情(例如 ss >> h >> d >> m >> d >> s >> d >> f)。
您还可以编写自己的解析类来处理拆分字符串。或者更好的是,使用 Boost 的 String Algorithms Library 中的 boost::split。
【讨论】:
boost::split 和 getline 的烦人之处在于,您必须拆分字符串,然后将它们返回到流中以获取整数
boost::split 将std::string 转换为std::vector<std::string>,然后使用std::transform 和boost::lexical_cast 将std::vector<std::string> 转换为std::vector<unsigned int>
您可以通过创建一个带有将: 分类为空格的 ctype facet 的语言环境来做到这一点。
Jerry Coffin explains how you can specify whitespace characters in this answer to another question.
【讨论】:
【讨论】:
scanf 而不是 C++ 的 istream::operator>> 肯定要容易得多。不过,您的意思可能是 sscanf(a.c_str(), "%d:%d:%d.%d", &h, &m, &s, &f) == 4。
char c;
if (!(ss >> h >> c) || c != ':') return;
if (!(ss >> m >> c) || c != ':') return;
if (!(ss >> s >> c) || c != '.') return;
if (!(ss >> f) || ss >> c) return;
【讨论】: