gpt4 book ai didi

c++ - 区分0-string和非0-string

转载 作者:太空宇宙 更新时间:2023-11-04 16:25:23 25 4
gpt4 key购买 nike

我们都知道如何将字符串转换为数字,即:

int str2num(const string& str) 
{
stringstream is(str);
int result;
return is >> result ? result : 0;
};

我的问题我希望能够区分字符串何时不能转换为数字但不是 0 例如:

1.) "0" => 0
2.) "0dasd" => 0
3.) "" => 0
4.) "some string" => 0 but true
5.) "345" => 345

我希望能够检测案例 (4)。我唯一的想法是查找字符串 !! .find() 之类的..stringstream 是否有某种方式表明这种情况?


编辑:一些说明:作为 num2str() 函数,当对话失败和/或返回 0 时我没问题,该函数也 return 0 (案例:1,2,3,4)。但是在 case 4 中,我希望能够在函数内部检测到它,以便像你说的那样抛出一个 err... 或带外返回使用 pair<> 或外变量的数据。

或者更明确地说,我想检测:

如果 是 >> num 返回 0(例如:“0”,“0.0”,“000”,“0sad”,“asd0ss”) 它真的是零还是它是字符串-不可转换为数字 I.E.区分0-string和非0-string

附言>我的困惑也可能出现,因为我不确定在转换时将 0-in-a-string 的哪些情况解释为 0-num 或 just-string 。我是不是更混淆了:)还是现在更清楚了?我想按照 Perl 零但真实的语义来实现一些东西。


EDIT2:感谢您提供了所有关于如何准确返回越界数据的示例,我真的很感激他们……我的意思是真的……(我可能会使用 pair<>,还不想使用 boost 或 C++11 语义)。但我更感兴趣的是“stringstream 认为什么是 0-stringnon-0-string 以及如何检测差异?

最佳答案

你的字符串转换函数不好,你应该心疼。

template<typename F> int str2num(const string& str, F&& f) {
stringstream is(str);
int result;
if (is >> result) return result;
return f();
}
int str2num(const string& str) {
return str2num(str, [] -> int {
throw std::runtime_error("Parse failure!");
});
}
int str2num(const string& str, int def) {
return str2num(str, [=] {
return def;
});
}

您选择 0 作为神奇的默认值是错误的 - 对于想要尝试解析整数的人来说,也许 32 是一个明智的默认值。 0 也可以是与解析失败分开的有意义的值。如果您想要一个默认值,您需要用户明确指定,因为您的随机 I/O 函数不知道什么是有意义的默认值。

如果用户没有以错误处理函数或有意义的默认值的形式提供明确的错误处理策略,则抛出异常是唯一的方法。

关于c++ - 区分0-string和非0-string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12442885/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com