从字符串c ++获取所有数字

时间:2018-03-07 19:58:14

标签: c++ string integer

我知道这个问题被问过几次,但没有一个答案符合我的需要 所以我有这个字符串

  

Sep = 1,V_Batt = 7.40,I_Batt = -559.63,V_SA = 7.20,I_SA = -0.55,I_MB = 500.25,V_5v = 4.95,I_5v = 446.20,V_3v = 3.28,I_3v = 3.45,S = 0,T_Batt = 25.24,T_SA1 = 22.95,T_SA2 = -4.86

我希望在“=”符号后面得到所有数字并创建一个像

这样的新字符串
  

1,7.40,559.63,7.20,0.55,500.25,4.95,446.20,3.28,3.45,0,25.24,22.95,4.68

任何人都可以帮我解决问题。我已经使用了stringstream但是我的输出全部为0 谢谢

4 个答案:

答案 0 :(得分:2)

基于对实际所需内容的正确理解,我做的事情与我最初建议的完全不同。在这种情况下,我同意斯蒂芬韦伯认为正则表达式可能是正确的方法,尽管我使用正确的正则表达式有所不同,并且有一些如何使用它(尽管后者可能与习惯一样多)我已经形成了其他任何东西)。

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

int main()
{
    using iter = std::regex_token_iterator<std::string::const_iterator>;

    std::string s = "Sep=1, V_Batt=7.40, I_Batt=-559.63, V_SA=7.20,
                    " I_SA=-0.55, I_MB=500.25, V_5v=4.95, I_5v=446.20,"
                    " V_3v=3.28, I_3v=3.45, S=0, T_Batt=25.24, T_SA1=22.95," 
                    " T_SA2=-4.86";

    std::regex re(R"#([A-Z][^=]*=([-\.\d]+))#");

    auto begin = iter(s.begin(), s.end(), re, 1);
    iter end;

    for (auto i = begin; i!= end; ++i)
        std::cout << *i << ", ";
    std::cout << '\n';
}

结果:

1,7.40,-559.63,7.20,-0.55,500.25,4.95,446.20,3.28,3.45,0,25.24,22.95,-4.86,

答案 1 :(得分:1)

如果已知参数的数量及其顺序,您可以使用snprintf,如下所示:

char str[100];
int Sep=1;
double V_Batt = 7.40, I_Batt = 559.63;// etc ...
snprintf(str, 100, "%d,%.2f,%.2f", Sep, V_Batt, I_Batt); //etc...
// str = 1,7.40,559.63

答案 2 :(得分:1)

使用fopen()函数打开文件。 它返回File *变量。当然,如果您的角色已经可用,请跳过此步骤。 使用这个File变量来获取每个char,让我们说,通过fgetc()。 检查获取的char变量的内容,并根据需要制作所需的内容,最后在新字符串中插入一些逗号

答案 3 :(得分:1)

这正是std::regex_iterator的用途。

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

int main()
{
    const std::string s = "Sep=1, V_Batt=7.40, I_Batt=-559.63, V_SA=7.20, I_SA=-0.55, I_MB=500.25, V_5v=4.95, I_5v=446.20, V_3v=3.28, I_3v=3.45, S=0, T_Batt=25.24, T_SA1=22.95, T_SA2=-4.86";
    std::regex re("[-\\d\\.]+");
    auto words_begin = std::sregex_iterator(s.begin(), s.end(), re);
    auto words_end = std::sregex_iterator();

    for (std::sregex_iterator i = words_begin; i != words_end; ++i)
        std::cout << (*i).str() << ',';
    std::cout << "\n";
}

上述完整程序的输出是这样的。

  

1,7.40,-559.63,7.20,-0.55,500.25,5,4.95,5,446.20,3,3.28,3,3.45,0,25.24,1,22.95,2,-4.86,