分隔字符串

时间:2014-07-21 07:05:29

标签: c++ string delimiter

在文本文件中,我有几行,每行看起来像下面一行(不同的数字)。

[275, 61],[279, 56],[285, 54],[292, 55],[298, 57],[315, 57],[321, 54],[328, 54],[335, 56]

说到一行,我想分别得到每一点。

例如:

  • 首先我应该[275, 61]
  • 然后我应该[279, 56]
  • 然后[285, 54]

然而,当我尝试以下内容时;

istringstream linestream(line); 

while (getline (linestream, item, ','))
{
               ...............
}
它给我的是:

           first [275 
           and then 61]
           next [279

有人能告诉我如何修改while循环以便获得所需的输出吗?

3 个答案:

答案 0 :(得分:2)

您看到的行为是预期的行为,因为您的定界符为','。如果你想分隔每一秒','你需要将你的标记连接两个两个。

例如“[275”+“,”+“61]”

考虑到你当前的输出,你应该可以通过简单的for循环来实现这一点。

答案 1 :(得分:1)

您使用getline时遇到的行为是正确的,因为您要使用,分隔。

为了获得所需的行为,如果您的编译器支持C ++ 11,您可以使用正则表达式库(即regex),如下例所示:

#include <iostream>
#include <string>
#include <regex>

int main() {
  std::string str("[275, 61],[279, 56],[285, 54],[292, 55],[298, 57],[315, 57],[321, 54],[328, 54],[335, 56]");
  std::regex e("\\[\\s*\\d+\\s*\\,\\s*\\d+\\s*\\]");
  std::smatch sm;
  std::regex_search(str, sm, e);
  std::cout << "the matches were: ";
  while (std::regex_search(str, sm, e)) {
    for(auto x : sm) std::cout << x << " ";
    std::cout << std::endl;
    str = sm.suffix().str();
  }
}

LIVE DEMO

答案 2 :(得分:-3)

假设文字是连贯的(没有错过&#39; [&#39;或&#39;]&#39;)您可以手动搜索&#39; [&#39;和&#39;]&#39;的位置,然后您可以复制它们之间的子字符串以进行进一步分析。 以下代码演示了如何提取和打印这些子字符串:

#include <stdio.h>
#include <string.h>

void main()
{
    const char* test=" [275, 61],[279, 56],[285, 54],[292, 55],[298, 57],[315, 57],[321, 54],[328, 54],[335, 56] ";
    char pair[20];
    int i,pos1,pos2;

    for (i=0,pos1=0,pos2=0; test[i]>0; i++)
    {
        if(test[i]=='[') pos1=i; //searching for '['
        if(test[i]==']') pos2=i; //searching for ']'
        //if(test[i]==']') printf("%.*s\n", pos2-pos1+1, test + pos1); //direct print from memory
        if(test[i]==']') strncpy_s(pair,sizeof(pair), test + pos1, pos2-pos1+1); // copy result sub-string to "pair"
        if(test[i]==']') printf("%s\n", pair); //print result on screen
    }
}