【问题标题】:Get all numbers from string c++从字符串 c++ 中获取所有数字
【发布时间】:2018-03-07 19:58:14
【问题描述】:

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

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 谢谢

【问题讨论】:

  • 你需要展示你的尝试。
  • 我用过 stringstream 但我得到的都是 0
  • 我什么都得不到,因为我没有心灵感应,也看不到你的代码。
  • @Hoa.N 显示您的代码。

标签: c++ string integer


【解决方案1】:

基于对实际需求的正确理解,我会做与我最初建议的完全不同的事情。在这种情况下,我同意 Stephen Webb 的观点,即正则表达式可能是正确的方法,尽管我对使用正确的正则表达式有不同的看法,以及如何使用它(尽管后者可能与习惯一样多)我已经形成了其他任何东西)。

#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,

【讨论】:

  • 是的,我只想获取“等号”后的值,我找到了一种使用正则表达式的方法,但是我不知道如何丢弃一些我不想要的数字字符串
【解决方案2】:

如果参数的数量及其顺序已知,您可以像这样使用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

【讨论】:

    【解决方案3】:

    使用 fopen() 函数打开您的文件。 它会返回 File* 变量。当然,如果您的字符已经可用,请跳过此步骤。 使用这个 File 变量来获取每个字符,比方说,通过 fgetc()。 检查获得的 char 变量的内容并用它做你想要的,最终在你的新字符串中插入一些逗号,必要时

    【讨论】:

      【解决方案4】:

      这正是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,

      【讨论】:

        猜你喜欢
        • 2016-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多