我需要创建一个函数来获取字符串中的这些数字

时间:2019-04-29 13:00:09

标签: c++ string

我正试图使一个带有参数的函数应该是这样

string s1 = "[1 -2.5 3;4 5.25 6;7 8 9.12]";

应该只返回没有分号或[和]和空格的数字

赞:

1 -2.5 3 4 5.25 6 7 8 9.12 

所以我以后可以将字符串转换为float并将其保存到数组中

有什么想法吗?

#include <iostream>
#include <string>
using namespace std;


string s1 = "[1 -2.5 3;4 5.25 6;7 8 9.12]";

void cutter(string s){


    for(int i=1;i<s.length();i++){
        if(i != s.find(" ") &&  i != s.find(";") ){
            cout << s[i];
            s.erase(0,i-1);

        }
        else if(i == s.find(" ") || i == s.find(";") ){
            cout<<endl;

        }


    }

}

int main()
{
    cutter(s1);
    return 0;
}

4 个答案:

答案 0 :(得分:2)

要删除[]并用空格替换;,您可以执行以下操作:

#include <algorithm>

void cutter(string &s) {
    s.erase(std::remove(s.begin(), s.end(), '['), s.end());
    s.erase(std::remove(s.begin(), s.end(), ']'), s.end());
    std::replace(s.begin(), s.end(), ';', ' ');
}

不需要对该字符串进行任何手动循环。另请注意,在函数签名中,您需要string &s,而不是string s。如果没有该&,您就将字符串的副本传递给该函数,并且该副本将在最后被丢弃,从而导致对原始副本的更改。使用&时,您传递的是引用,程序将按预期工作。


当然,您也可以通过复制保留它,而返回修改后的字符串:

std::string cutter(std::string s) {
    // modify the string here
    return s; // returns the modified copy
}

然后在main中,执行以下操作:

s1 = cutter(s1); // assign the result to the original to change it

答案 1 :(得分:0)

如果您有,那么这几乎是微不足道的:

std::vector<std::string> result;

boost::remove_erase_if(s1, boost::is_any_of("[]"));

boost::split(result, s1, boost::is_any_of(" ;"));

您可能想要复制s1,因为在此示例中它将被突变。

答案 2 :(得分:0)

以下是使用两个功能的解决方案。

一个函数返回一个没有[,]和;

的新字符串。

另一个函数将具有浮点值的字符串转换为浮点向量。

#include <iostream>
#include <sstream>
#include <string>
#include <vector>

std::string s1 = "[1 -2.5 3;4 5.25 6;7 8 9.12]";

std::string cutter(std::string &s){
    std::string res = "";
    for (auto c : s)                                 // Loop over all chars in s
    {
        if (c == ';') res += ' ';                    // Replace ; with space
        else if ((c != '[') && (c != ']')) res += c; // Skip [ and ]
    }
    return res;
}

std::vector<float> string_to_floats(std::string &s)
{
      float f;
      std::vector<float> res;

      std::stringstream stream(s);        // Create and initialize the stream
      while(1)
      {
          stream >> f;                    // Try to read a float
          if (stream.fail()) return res;  // If it failed, return the result
          res.push_back(f);               // Save the float in the result vector
      }
}

int main()
{
    std::string s2 = cutter(s1);
    std::cout << s2 << std::endl;

    std::vector<float> values = string_to_floats(s2);
    std::cout << "Number of floats: " << values.size() << std::endl;
    for (auto f : values) std::cout << f << std::endl;

    return 0;
}

输出:

1 -2.5 3 4 5.25 6 7 8 9.12
Number of floats: 9
1
-2.5
3
4
5.25
6
7
8
9.12

答案 3 :(得分:0)

这是基于正则表达式的解决方案(c ++ 11及更高版本):

x_sorted = np.sort(x)
plt.plot(x_sorted, func(x_sorted, *popt), label="Fitted Curve")
plt.show()

输出:

#include <iostream>
#include <regex>

using namespace std;

string cutter(string src) {
 string out, dlm;
 regex e(R"(-?\d+\.?\d*)");
 smatch m;

 while(regex_search(src,m,e)) {
  for(const auto &x: m) 
   { out += dlm + string(x); dlm = ' '; }
  src = m.suffix().str();
 }

 return out;
}

int main()
{
 string s1 = "[1 -2.5 3;4 5.25 6;7 8 9.12]";

 cout << cutter(move(s1)) << endl;   
 return 0;
}

此外,基于去除多余字符的解决方案(但习惯上第一个是更可取的):

1 -2.5 3 4 5.25 6 7 8 9.12