我有以下代码。我在atoi()中遇到了这一行,并不能理解它做了什么
while (*str != '\0')
{
digit = *str - '0';
result = result * radix + digit;
str++;
}
*str -'0'
这是什么意思?
我有以下代码。我在atoi()中遇到了这一行,并不能理解它做了什么
while (*str != '\0')
{
digit = *str - '0';
result = result * radix + digit;
str++;
}
*str -'0'
这是什么意思?
它将ASCII字符'0'到'9'分别转换为整数值0到9。 (显然,如果你确定*str
实际上是字符'0'到'9'中的一个,这只是一个好主意。)
所以如果我的char * str是“string”的话。数字的第一个值是什么? – 2013-02-13 06:03:15
这是atoi()的无效使用。垃圾进垃圾出。 atoi()的Linux手册页说“atoi()不检测错误”。 但是,对您的问题的严格回答是:数字的第一个值将是对应于's'的整数值,减去对应于'0'的整数值。 – 2013-02-13 06:05:36
@ RyanV.Bissell不要读“人”,这是不好的,充满了错误。 C11 7.22.1.2表示atoi相当于'(int)strtol(nptr,(char **)NULL,10)'。 C11 7.22.1.4/8'strtol ...“/ - /”...函数返回转换后的值(如果有的话)。如果不能执行转换,则返回零。' – Lundin 2013-02-13 07:45:32
* str可能指向字符值从'0' - '9',然而,如果用* str来使用简单的算术,那么可能无法按预期工作。如果* str指向字符'4'并且我们执行'4'+ 2,结果实际上是54,因为'4'的ASCII值是52.所以通过从* str减去'0',我们将ASCII值转换为数字。 “4” - “0” + 2 = 6
该字符值*str
转换成一个整数,通过从当前字符中减去数字'0'
的编码值。整数值将在0到9的范围内。
这可以工作,因为C保证数字0到9总是使用相邻值进行编码(即编码值'1'
保证与'0' + 1
完全一致,并且等等)。
许多人似乎认为这“利用”了ASCII的某些事实,但无论系统的本机编码如何,这都必须适用于C运行的任何平台。
C中'z' - 'a'是什么?现在清楚了吗? – 2013-02-13 05:55:45