寻找循环特定字符串的最优雅的解决方案

时间:2015-07-23 13:21:50

标签: c++ string algorithm loops

所以我下载了十几个字符串,其中一个例子是这个

" Australija 036 AUD 1 5,136250 5,151705 5,167160"

空格在这里显示为单个,但实际上在数字和字符之间是多个。

所以我的第一个想法是手动计算我需要的数字(第二个,在这个例子中为5.151705)并获得子串。(41,8)但这似乎对我来说。

第二个想法是将所有数字保存为向量中的字符,然后得到 vector [4]并将其保存为单独的变量。

第三个是循环字符串,直到我将自己定位在第五组空格之后,然后对其进行子串。

只是寻找一些关于最佳和#34;

的反馈

3 个答案:

答案 0 :(得分:1)

我会使用流来执行此任务,因为它们以优雅的方式吞噬了多个空格。

#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
#include <iomanip>


int main() {
  std::string line = "Australija  036   AUD  1  5,136250  5,151705   5,167160";

  // Extract string beginning
  std::istringstream input(line);
  std::string p1, p2, p3;
  int i1 = 0;
  input >> p1 >> p2 >> p3 >> i1;

  // Replace commas
  std::string double_numbers;
  std::getline(input, double_numbers);
  std::replace(double_numbers.begin(), double_numbers.end(), ',','.');

  // Extract the remaining numbers
  double d1 = 0, d2 = 0, d3=0;
  std::istringstream(double_numbers) >> d1 >> d2 >> d3;

  // Print result
  std::cout << std::setprecision(10) << d2 << std::endl;

  return 0;
}

答案 1 :(得分:0)

#include <bits/stdc++.h>
using namespace std;

int main() {
    // your code goes here
    string str="abc   def ghi   1234 5.123";
    stringstream ss(str);
    string token;
    int i=0;
    while(ss>>token ){
        if(i==4){
        printf("%s\n",token.c_str());
        }
        i++;
    }
    return 0;
}

ideone.com

上运行

答案 2 :(得分:0)

您还可以考虑首先修剪多个空格。像

这样的东西
std::string str = "Australija  036   AUD  1  5,136250  5,151705   5,167160";
str.erase(std::unique(str.begin(), str.end(), [](char a, char b) {
        return ::isspace(a) && ::isspace(b);
    }), str.end());

字符串拆分也可能有用

std::vector<std::string> split(std::string & str, char delim) {
    std::vector<std::string> result;
    std::stringstream ss(str);
    std::string token;
    while (getline(ss, token, delim)) result.push_back(token);
    return result;
}

并将其称为

std::vector<std::string> result = split(str, ' ');