我正试图使一个带有参数的函数应该是这样
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;
}
答案 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)
如果您有boost,那么这几乎是微不足道的:
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