2012-12-10 59 views
3

所有,字母数字在C歧义数字

功能,这检查和隐蔽如果字符串是数字或不例如蒂和的atoi ... 我在C/C++参考检查在蒂描述,它是在字符串中没有任何数字的情况下写成这样。

不执行转换并返回零。

显然,这可以是多义性,如果我传递的字符串是"0"所以蒂意愿返回零相同先例案件。

由于函数签名为int的atoi()或长蒂()返回的值可能是一个int或长,所以返回值将在所有情况下匹配一个真正的int类型的返回值。(我的意思是,即使atoi返回一个负数的无数字字符串,这个返回值与这个值的字符串转换匹配它自己)歧义坚持

如果它是一个数字或不使用此函数检查字符串是不安全的? 这种情况下最好的解决方案是什么?

+1

atoi不安全,您应该使用strtol代替。 – Lucas

+1

C或C++,只能有一个。另外,Boost有词法铸造,完成任务 – thecoshman

+0

strtol同样的情况它是一个int long strtol它在非数值情况下返回零 – Aymanadou

回答

4

使用strtolstrtoll,它们返回的第一个无效字符的位置,所以你知道,如果任何转换有发生。

+0

strtol同样的情况它是一个int long strtol它在非数值情况下返回0 – Aymanadou

+1

@Aymanadou,使用第二个参数。 – chill

+1

从[文档](http://www.manpagez.com/man/3/strtol/):'如果endptr不是NULL,strtol()将*第一个无效 字符的地址存储在* endptr中。但是,如果根本没有数字,strtol() 将str的原始值存储在* endptr中。 (因此,如果* str不是'\ 0' 但是** endptr在返回时是'\ 0',那么整个字符串都是有效的。)' – ams

2
(int)strtol() 

你可以通过一个char *验证转换

2

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

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

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

+0

strto ... group也会返回一个int值,所以歧义仍然存在。 你可能想说我应该在作为参数传递的end_pointer上工作,以知道是否进行了转换?如果可以,请添加一些细节? – Aymanadou

0

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