我不知道';不理解K&;中的atoi函数;R C书?

我不知道';不理解K&;中的atoi函数;R C书?,c,atoi,C,Atoi,这会将字符串表示形式转换为数字,如“329”到329 先取3,然后取3*10+2=32 然后为(i;s[i]>='0'和&s[i]R顺序设置32*10+9=329*/ for(i;s[i]>='0' && s[i]<='9';i++) n = 10*n + (s[i]-'0'); n=10*n+(s[i]-'0');/*取到目前为止的值,将10的位置左移, 并添加最新数字的值 (数字的ASCII与零的ASCII之间的差异)*/ 让我们来分析一下: for(i;s[i

这会将字符串表示形式转换为数字,如“329”到329
先取3,然后取3*10+2=32
然后为(i;s[i]>='0'和&s[i]R顺序设置32*10+9=329

*/
for(i;s[i]>='0' && s[i]<='9';i++)
n = 10*n + (s[i]-'0');
n=10*n+(s[i]-'0');/*取到目前为止的值,将10的位置左移, 并添加最新数字的值 (数字的ASCII与零的ASCII之间的差异)*/
让我们来分析一下:

for(i;s[i]>='0' && s[i]<='9';i++) /* loop over just the digits, in L->R order */
    n = 10*n + (s[i]-'0');        /* Take value so far, "shift" a 10's place left, 
                                     and add in value of latest digit
                                     (diff between ASCII of digit & ASCII of zero) */
这将创建一个for循环,使用循环变量
i
。这不是必需的,而是一种编码风格

for (i;
循环运行后,这会将您在字符串中检查的索引增加1

i++
这将通过乘以10向“n”添加一个额外的数字,因为您知道如果您的数字中还有一个字符,那么它必须乘以10(假设我开始解析100,我读取前两个字符串,有10,还有一个字符,所以我乘以10得到100)

n = 10 * n
这会将下一个数字添加到“n”中,结果是通过将当前索引处的字符减去“0”来确定的,当在0-9范围内时,该值将返回该数字的整数(如果这让您感到困惑,请查看示例)


希望这有助于您理解。

部分
s[i]-“0”
从“0”的字符数中减去循环所使用的任何数字的字符数,从而产生的不是ASCII值,而是实际数字。它使用字符串中字符的ASCII数。s[0]='9'=decimal ascii 57。'0'=decimal ascii 48.57-48=9。这不是K&R写的;他们不会(也不会)在
中为(i;s[i]>='0'&s[i]='0'&s[i]写第一个
i
,你也不应该依赖
系统(“暂停”)
,因为这是不可移植的。相反,你应该使用类似
getchar()
fgets()
如果我将字符串设为
s[]=“A”
并在for循环中
表示(i;s[i]>=“A”和&s[i]@ViswanathanIyer不,函数不会,它将返回一个意外值,这将是许多数字的混合。如果你想从任意字符串创建哈希,有更好的函数。我想使用自己的atoi函数打印B的ASCII值。我如何在上面的程序中实现它?你说的“ASCII”值是什么意思?Y您只需在代码中编写它:
printf(“%i”,(int)“B”);
,它将输出66,这就是您想要的吗?
i++
n = 10 * n
+ (s[i]-'0');