CString 解析回车
Posted
技术标签:
【中文标题】CString 解析回车【英文标题】:CString Parsing Carriage Returns 【发布时间】:2011-08-12 16:21:19 【问题描述】:假设我有一个包含多个回车符的字符串,即:
394968686 100630382 395950966 335666021
我仍然是 C++ 的业余时间,有人愿意告诉我你是怎么做的:解析字符串中的每个“行”吗?所以我可以稍后用它做点什么(将所需的行添加到列表中)。我猜在循环中使用 Find("\n")?
谢谢大家。
【问题讨论】:
回车 (\r) 不是换行符 (\n)。在编写循环之前,找出字符串中包含哪一个(或两者)非常重要。 【参考方案1】:您可以使用 stringstream 进行尝试。请注意,您可以重载 getline 方法以使用您想要的任何分隔符。
string line;
stringstream ss;
ss << yourstring;
while ( getline(ss, line, '\n') )
cout << line << endl;
您也可以使用 boost 库的分词器类。
【讨论】:
这是解析字符串效率最低的方法之一 @Gene - 它在计算效率方面的不足,它用简单性和多功能性来弥补。如果您的输入是文件流,重用它是轻而易举的事。【参考方案2】:while (!str.IsEmpty())
CString one_line = str.SpanExcluding(_T("\r\n"));
// do something with one_line
str = str.Right(str.GetLength() - one_line.GetLength()).TrimLeft(_T("\r\n"));
此代码将删除空白行,但如有必要,很容易纠正。
【讨论】:
【参考方案3】:您可以在 C++ 中使用stringstream
类。
#include <iostream>
#include <sstream>
#include <vector>
using namespace std;
int main()
string str = "\
394968686\
100630382\
395950966\
335666021";
stringstream ss(str);
vector<string> v;
string token;
// get line by line
while (ss >> token)
// insert current line into a std::vector
v.push_back(token);
// print out current line
cout << token << endl;
Output of the program above:
394968686
100630382
395950966
335666021
请注意,使用运算符>>,解析的标记中不会包含空格。请参考下面的cmets。
【讨论】:
或string line; while (std::getline(ss, line)) ...
它们并不完全相同。 std::getline 也将空格作为字符串的一部分读取,而重载 >> 则不会。这取决于 OP 需要什么。
问题是关于 MFC 的 CString,而不是 std::string。看不出这个答案有什么意义。
@Mark,如果需要,您可以随时将 CString 转换为 std::string。
从类型到类型的转换是丑陋的。为什么不提供将 CString 转换为字符数组(或 wchars)然后在每个字符上循环并最终转换回 CString 的方法?【参考方案4】:
如果您的字符串存储在 c 风格的 char* 或 std::string
中,那么您只需搜索 \n
。
std::string s;
size_t pos = s.find('\n');
您可以使用string::substr()
获取子字符串并将其存储在列表中。伪代码,
std::string s = " .... ";
for(size_t pos, begin = 0;
string::npos != (pos = s.find('\n'));
begin = ++ pos)
list.push_back(s.substr(begin, pos));
【讨论】:
以上是关于CString 解析回车的主要内容,如果未能解决你的问题,请参考以下文章
如何知道 std::string/Cstring 中的值是不是为数字