解析C++中的完整(从头到尾)字符串,包括所有空格
Parse a whole (beginning to end) string in C++, including all whitespace
我正在寻找一种在C++中通用解析整个字符串的方法。我的意思是整个字符串在解析中使用,否则就是错误。这意味着为大多数类型划定空格的朴素operator >>
行为不是我想要的(尽管如果解决方案涉及它,我会非常高兴(。一些例子:
// Parse a whole value, throwing an exception if there's a parse error
void parse_into<typename T>(const char* input, T& result);
double value = 0;
parse_into("12.5", value); // #1: Success
parse_into("ABC", value); // #2: Fail
parse_into("12.5 abc", value); //#3: Fail
std::string str_value;
parse_into("ABC", str_value); // #4: Success
parse_into("ABC ABC", str_value); // #5: Success; str_value == "ABC ABC"
parse_into("ABC ABC", str_value); // #6: Success; str_value == "ABC ABC'
我相信我想要的是围绕stringstream
和operator >>
.我可以看到如何通过检查stringstream
是否为空来检测是否未解析整个字符串(案例 #3(。但是,我无法弄清楚的是一种通用方法,允许可以从任何字符串构造的类型,例如std::string
.也许是涉及可以从const char*
构造类型的 SIFNAE 重载?
我对最终界面没有特别的正式要求;我想要的是让它做任何给定类型的"正确事情"。对于上下文,这适用于命令行参数分析库。该库处理检测单词边界,因此我知道parse_into
输入是我尝试阅读的整个单词。
对于double
来说,这可以通过std::stod
在首次读取您的输入作为std::string
后实现。
std::optional<double> parse(std::string const& str) {
std::size_t num = 0;
try {
auto const res = std::stod(str,&num);
if (num < str.size()) return std::nullopt;
return res;
} catch (...) {
return std::nullopt;
}
}
您可以为不同类型的类型创建重载(例如,使用传入的值(。我在这里使用std::optional
,但您也可以throw
或使用任何其他方式来传达错误。
例如:
bool parse(std::string const& str, double& out);
bool parse(std::string const& str, std::uint32_t& out);
bool parse(std::string const& str, std::string& out); // always succeeds
// ...
编辑:一个更通用的接口,允许传递任何类型的stoXYZ
函数:
template <typename T>
static void parse(std::string const& s, T (*fun)(std::string const&,std::size_t*,int), std::optional<T>& out) { /**/ }
template <typename T>
static void parse(std::string const& s, T (*fun)(std::string const&,std::size_t*), std::optional<T>& out) { /**/ }
这需要一个指向函数的指针,但它也可能需要一个std::function
对象。存在这两个重载是因为std::stoi
和std::stod
具有不同的参数列表(整数需要基数(。
相关文章:
- 当我尝试使用 sstream 和分面将 Boost Time_duration转换为字符串时,我没有得到所需的格式
- 函数不返回所需的字符串
- 如何将字符串与结构(也包括字符串)进行比较?
- 如何将字符串转换为整数,如下所示
- 解析C++中的完整(从头到尾)字符串,包括所有空格
- 包括<字符串>,使用不完整的类型"std::string"
- (C++) 取字符串的每个字符并将其放入数组中并获取所述数组的大小?
- 递归地将给定字符串转换为它所表示的数字
- 如何调整标准::字符串的大小以删除所有空终止符字符?
- 提升正则表达式 cpp 用于查找 %% 之间的字符串,输出不包括 % 字符本身
- 试图将字符串变为char数组,请帮助我仅在数组中获得所需的字符
- 将整数转换为阵列(包括领先的零),而无需使用字符串
- 减少将参数传递给函数所需的字符串流操作的详细程度
- 清理所拥有的(!)字符串成员时,析构函数偶尔崩溃
- 更新:正在输出内存位置,而不是所需的字符串
- 如何初始化字符串以包含C 中所需数量的数字数量
- 在字符串上迭代,但将定界器保持在子字符串中,包括其他规则
- 在数组中搜索字符串的所有术
- cout 不会打印C++字符串(包括<iostream>、包含<string>和刷新所有存在的内容)
- 在 c++ 中查找传入字符串(包括 ° 等特殊字符)中的模式