3

全部,

检查和隐藏字符串是否为数字的函数,例如 atol 和 atoi ...我在 atol 描述中检查了 c/c++ 参考,在字符串中没有任何数字的情况下它是这样写的。

不执行任何转换并返回零。

"0"显然,如果我传递的字符串如此 atol 将返回与前例相同的零,这可能是一个歧义。

由于函数签名是 int atoi() 或 long atol(),因此返回值可能是 int 或 long,因此返回值在所有情况下都将与实际 int 的返回值匹配。(我的意思是即使 atoi 返回负数非数字字符串的值此返回的值与此值的字符串的转换匹配)它自己)歧义持续存在

检查字符串是否为数字或不使用此函数是否不安全?对于这种情况,什么是好的解决方案?

4

5 回答 5

4

使用strtolor strtoll,它们返回第一个无效字符的位置,以便您知道是否发生了任何转换。

于 2012-12-10T09:19:55.933 回答
2
(int)strtol()

您可以传递一个 char * 来验证转换

于 2012-12-10T09:19:52.623 回答
2

来自组的函数ato...实际上没有任何有意义的实际用途。为了执行此转换或检查输入字符串是否具有正确的格式,请使用strto...组中的函数。

除了返回转换后的实际值外,strto...组中的函数还会告诉您输入字符串中的哪个字符导致转换过程停止。此外,这些函数会将全局errno变量设置为ERANGE以防溢出。通过在通话后分析这些附加数据,您可以准确判断转换是否成功。

同时,ato...函数没有提供有意义的诊断功能。它们还会在溢出时触发未定义的行为。

于 2012-12-10T09:22:53.963 回答
1

如果您使用的是 c++11,则可以使用位于 <string> 中的 stoi()。如果转换失败,它将引发异常:http: //en.cppreference.com/w/cpp/string/basic_string/stol

于 2012-12-10T09:25:22.210 回答
0

它既不安全也不不安全。它根本不这样做。这是否“安全”取决于您已经为验证输入所做的工作。如果您希望验证作为将文本转换为值的一部分,strtol则为您提供更多信息。

于 2012-12-10T14:24:34.760 回答