CString синтаксический анализ возврата каретки - PullRequest
1 голос
/ 12 августа 2011

Допустим, у меня есть строка с несколькими возвратами каретки, то есть:

394968686
100630382
395950966
335666021

Я все еще довольно любительчас с C ++, кто-нибудь хотел бы показать мне, как вы идете: анализ каждой "строки" в строке?Так что я могу сделать что-то позже (добавить нужную строку в список).Я предполагаю использовать Find ("\ n") в цикле?

Спасибо, ребята.

Ответы [ 4 ]

1 голос
/ 12 августа 2011
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"));
}

Пустые строки будут удалены с помощью этого кода, но это легко исправить при необходимости.

1 голос
/ 12 августа 2011

Вы можете попробовать это используя stringstream. Обратите внимание, что вы можете перегрузить метод getline, чтобы использовать любой желаемый разделитель.

string line;
stringstream ss;
ss << yourstring;
while ( getline(ss, line, '\n') )
{
  cout << line << endl;
}

В качестве альтернативы вы могли бы использовать класс токенизатора библиотеки повышения.

0 голосов
/ 12 августа 2011

Вы можете использовать stringstream класс в C ++.

#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

Обратите внимание, что пробел не будет включен в проанализированный токен с использованием оператора >>.Пожалуйста, обратитесь к комментариям ниже.

0 голосов
/ 12 августа 2011

Если ваша строка хранится в символе c-style * или 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));
}
...