19

たとえば、このようなフォーマットされた文字列を読み取る方法はありますか:48754+7812=Abcs

3つのstringzX、Y、Zがあり、

X = 48754 
Y = 7812
Z = Abcs

2つの数字のサイズと文字列の長さは異なる場合があるので、私はsubstring()そのようなものを使いたくありません。

このようなパラメータをC++に与えることは可能ですか?

":#####..+####..=SSS.."

だからそれは何が起こっているのかを直接知っていますか?

4

4 に答える 4

26
#include <iostream>
#include <sstream>

int main(int argc, char **argv) {
  std::string str = ":12341+414112=absca";
  std::stringstream ss(str);
  int v1, v2; 
  char col, op, eq; 
  std::string var;
  ss >> col >> v1 >> op >> v2 >> eq >> var;
  std::cout << v1 << " " << v2 << " " << var << std::endl;
  return 0;
}
于 2012-07-07T11:40:50.297 に答える
13

可能性はですboost::split()。これにより、複数の区切り文字を指定でき、入力のサイズに関する事前の知識は必要ありません。

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

#include <boost/algorithm/string.hpp>
#include <boost/algorithm/string/split.hpp>

int main()
{
    std::vector<std::string> tokens;
    std::string s(":48754+7812=Abcs");
    boost::split(tokens, s, boost::is_any_of(":+="));

    // "48754" == tokens[0]
    // "7812"  == tokens[1]
    // "Abcs"  == tokens[2]

    return 0;
}

または、を使用してsscanf()

#include <iostream>
#include <cstdio>

int main()
{
    const char* s = ":48754+7812=Abcs";
    int X, Y;
    char Z[100];

    if (3 == std::sscanf(s, ":%d+%d=%99s", &X, &Y, Z))
    {
        std::cout << "X=" << X << "\n";
        std::cout << "Y=" << Y << "\n";
        std::cout << "Z=" << Z << "\n";
    }

    return 0;
}

ただし、ここでの制限はZ、入力を解析する前に文字列の最大長()を決定する必要があることです。

于 2012-07-07T11:35:25.930 に答える
4

を使用できますscanf。これは過度にC++であるわけではありませんが、非常に少ないコード行でトリックを実行します。

char a[101], b[111], c[121];
sscanf(":48754+7812=Abcs", ":%100[^+]+%110[^=]=%120s", a, b, c);
string sa(a), sb(b), sc(c);
cout << sa << "-" << sb  << "-" << sc << endl;

非常に限定された正規表現構文を使用して、読み取る文字列が受け入れる文字を指定するという考え方です。この場合、最初の文字列はプラスまで読み取られ、2番目の文字列は等号まで読み取られます。

于 2012-07-07T11:44:07.060 に答える
3

例えば。

#include <boost/regex.hpp>
#include <iostream>

int main()
{
   boost::regex re("\":(\\d+)\\+(\\d+)=(.+)\"");
   std::string example = "\":48754+7812=Abcs\"";
   boost::smatch match;
   if (boost::regex_match(example, match, re))
   {
      std::cout << "f number: " << match[1] << " s number: " << match[2] << " string: " << match[3]
      << std::endl;
   }
   else
   {
      std::cout << "not match" << std::endl;
   }
}

2番目のバリアントは、文字列でのみ機能します。

#include <string>
#include <iostream>

int main()
{
   std::string s = "\":48754+7812=Abcs\"";
   std::string::size_type idx = s.find(":");
   std::string::size_type end_first = s.find("+", idx + 1);
   std::string f_number = s.substr(idx + 1, end_first - (idx + 1));
   std::cout << f_number << std::endl;
   std::string::size_type end_second = s.find("=", end_first + 1);
   std::string s_number = s.substr(end_first + 1, end_second - (end_first + 1));
   std::cout << s_number << std::endl;
   std::string::size_type string_end = s.find("\"", end_second);
   std::string str = s.substr(end_second + 1, string_end - (end_second + 1));
   std::cout << str << std::endl;
}
于 2012-07-07T11:40:04.780 に答える