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 中的值是不是为数字

WinCE7.0 Win32智能设备项目使用 CString 的问题

将CString里的连续字符串压缩为一个

将CString里的连续字符串压缩为一个

将CString里的连续字符串压缩为一个

CString.Format汉字问题