从C++字符串中提取数据

问题描述 投票:0回答:4

我想用 C++ 从字符串中提取值。我想这不是 C++ 的做法,但这种方式尤其行不通。有什么想法吗?

string line = "{10}{20}Hello World!";
int start;
int end;
string text;

// What to use here? Is the sscanf() a good idea? How to implement it?

cout << start; // 10
cout << end; // 20
cout << text; // Hello World!
c++
4个回答
3
投票

虽然您可以使

sscanf
工作,但此解决方案更适合 C 程序。在 C++ 中,你应该更喜欢字符串流

string s("{10}{20}Hello World!");
stringstream iss(s);

现在您可以使用熟悉的流操作将输入读取为整数和字符串:

string a;
int x, y;
iss.ignore(1, '{');
iss >> x;
iss.ignore(1, '}');
iss.ignore(1, '{');
iss >> y;
iss.ignore(1, '}');
getline(iss, a);

演示。


3
投票

您可以使用 String.find() 方法获取 '{' 和 '}' 的位置,然后通过 String.substr() 提取您想要的数据。


0
投票

使用正则表达式的解决方案:

#include <iostream>
#include <regex>

std::string line = "{10}{20}Hello World!";

// Regular expression, that contains 3 match groups: int, int, and anything
std::regex matcher("\\{(\\d+)\\}\\{(\\d+)\\}(.+)");

std::smatch match;
if (!std::regex_search(line, match, matcher)) {
  throw std::runtime_error("Failed to match expected format.");
}

int start = std::stoi(match[1]);
int end = std::stoi(match[2]);
std::string text = match[3];

-2
投票

在 sscanf 中,文本前面不需要有“&”,因为字符串名称已经是指向其起始地址的指针。

sscanf(line, "{%d}{%d}%s", &start, &end, text);
© www.soinside.com 2019 - 2024. All rights reserved.