有没有一种方便的方法来解析c + +中的string::iterator
的整数?对于这个特定的问题,我只关心非负整数,但所有这些解决方案都可以很容易地扩展为任意整数。请注意,与similar questions不同,我没有对原始字符串的引用,只有一个迭代器,例如C++从字符串指针解析int
int parse_next_int(std::string::iterator begin, std::string::iterator end) {
// ...
}
我可以想到很多方法,但没有一个很棒。另外需要注意的是,我没有声明stl头文件,而且我假定一切都在std
命名空间中完成。希望这不会让这些例子太难以解析。
分配一个新的字符串,然后调用Stoi旅馆:
int parse_next_int(string::iterator begin, string::iterator end) { string::iterator num_end = find_if( begin, end, [](char c)->bool{return !isdigit(c);}); string to_parse(begin, num_end); return stoi(to_parse); }
这样做的缺点是,我最终的东西,大概可以被动态解析分配一个新的缓冲区。
不安全地视为c字符串。
int parse_next_int(std::string::iterator begin, std::string::iterator end) { return atoi(&(*begin)); }
这将一定程度上工作,但如果它击中了字符串的结尾,它不是没有空值终止的(这是不符合C++字符串的保证),它会段错误,所以虽然漂亮,简洁,这可能是最不好。
写自己:
int parse_next_int(std::string::iterator begin, std::string::iterator end) { int result = 0; while (begin != end && isdigit(*begin)) { result = result * 10 + (*begin++ - '0'); } return result; }
这工作是简单的,但它也严重依赖的问题,而不是非常容错。
有一些主要依靠更加宽容STL电话,同时仍然简单,避免不必要的复制缓冲区显著不同的方法?
只是间接通过迭代器,你得到的字符串。然后你可以使用任何你会使用的方法,如果你有字符串。 – Barmar
'strtol'比'atoi'更可取。 (但都有问题,你不能限制他们'结束')。你的选项3会导致一些输入的未定义行为(与atoi相同的问题) –