Jon*_*Mee 6 c++ string atoi string-conversion extraction-operator
给定一个应该代表数字的字符串,我想把它放入一个转换函数,如果整个字符串没有转换就会提供通知.
输入"12"::
istringstream::operator>> 输出12atoi 输出12stoi 输出12对于输入,"1X"我想要一个失败的响应,但我得到:
istringstream::operator>> 输出1atoi 输出1stoi 输出1输入"X2":
istringstream::operator>> 输出0并设置错误标志atoi 输出0stoi 抛出错误[ 实例 ]
有没有办法在输入上引发错误行为"1X"?
编辑:在c++17或更高版本中from_chars是首选。请参阅此处了解更多信息:https://topanswers.xyz/cplusplus?q =724#a839
对于给定的情况,string str有多种方法可以实现这一目标,每种方法都有优点和缺点。我在这里写了一个实例: https: //ideone.com/LO2Qnq并在下面讨论每个示例:
strtol正如这里 strtol所建议的,可以使用输出参数来获取读取的字符数。strtol实际上返回的是long一个而不是一个int所以在返回时发生了强制转换。
char* size;
const int num = strtol(str.c_str(), &size, 10);
if(distance(str.c_str(), const_cast<const char*>(size)) == str.size()) {
cout << "strtol: " << num << endl;
} else {
cout << "strtol: error\n";
}
Run Code Online (Sandbox Code Playgroud)
请注意,这用于str.c_str()引用相同的字符串。c_str如果您有 C++11,则返回指向用作字符存储的底层数组的指针,而不是临时数组:
c_str()并data()执行相同的功能
另请注意,返回的指针在和调用c_str之间有效,除非:strtoldistance
- 将非
const引用传递给string任何标准库函数- 调用 上的非
const成员函数string,不包括operator[]、at()、front()、back()、begin()、rbegin()和end()rend()
如果您违反了其中任何一种情况,您将需要制作 的底层的临时副本i并const char*对其执行测试。
sscanfsscanf可以用来%zn返回读取的字符数,这可能比进行指针比较更直观。如果基础很重要,sscanf可能不是一个好的选择。与支持基数 2 - 36 的strtol和不同,仅提供八进制 ( )、十进制 ( ) 和十六进制 ( ) 的说明符。stoisscanf%o%d%x
size_t size;
int num;
if(sscanf(str.c_str(), "%d%zn", &num, &size) == 1 && size == str.size()) {
cout << "sscanf: " << num << endl;
} else {
cout << "sscanf: error\n";
}
Run Code Online (Sandbox Code Playgroud)
stoi正如这里 stoi所建议的,输出参数的工作方式类似于sscanf返回%n读取的字符数。与 C++ 保持一致,这需要一个string,与上面的 C 实现不同,如果第一个非空白字符不被视为当前基数的数字,则stoi抛出一个invalid_argument,不幸的是,这意味着与 C 实现不同,它必须检查两个中的错误try和catch块。
try {
size_t size;
const auto num = stoi(str, &size);
if(size == str.size()) {
cout << "stoi: " << num << endl;
} else {
throw invalid_argument("invalid stoi argument");
}
} catch(const invalid_argument& /*e*/) {
cout << "stoi: error\n";
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
508 次 |
| 最近记录: |