2016-02-18 42 views
0

您好我正在尝试做一个相当于atoi的函数。第一我想看到转变是正确的,但事实并非如此。你能帮我弄清楚为什么它不起作用吗?atoi的等效函数不起作用

int atoi2(char *string) 
{ 
    int i,numar,aux,p[10]={48,49,50,51,52,53,54,55,56,57}; 
    while(*string!='\0') 
    { 
    aux=(int)*string; 

    for(i=0;i<10;i++) 
    { 
     if(p[i]==aux) 
     { 
      numar=numar*10+i; 
     } 
    } 
    string++; 
} 
return numar; 
} 
+3

'numar'未初始化。 – EOF

+1

而女士们,先生们,这也是我们为什么只在我们初始化它们的地方声明变量的原因。这不是K&R了,你不必在顶部声明所有变量。此外,空间是免费的,有一些。他们做*奇迹*为易读性。 – DevSolar

回答

1

的局部变量必须在使用前进行初始化,这是政策不在于你不需要的C支付的一部分语言。

此外,您不需要使用数组,因为数字ASCII值是连续的,所以如果您只从ASCII值中减去48,那么代码将是等效的。所以*string - '0' == i

int numar = 0; 
while (*string != '\0') { 
    numar = numar*10 + (*string - '0'); 
    ++string; 
} 
+1

可能值得一提的是,如果包含非数字字符,那么'* string - '0''将导致与其原始代码不同的行为。 –

+0

是的,检查'* string> ='0'&& * string <='9''会很理智。但在任何情况下,依赖于字符的特定编码(这是OP所做的)在任何情况下都是不安全的,所以最终谁在乎。 – Jack

1

您忘记了初始化numar。如果你没有明确地设置一个自动变量的值,它的值是未定义的,编译器可以做任何喜欢的事情。要解决此问题,更改第三行:

int i,numar=0,aux,p[10]={48,49,50,51,52,53,54,55,56,57};