有沒有一種方便的方法來解析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相同的問題) –