2017-10-19 214 views
0

与我的程序一样,我需要将包含的数字返回到字符串中 我的程序似乎可行,但可以肯定的是,我需要显示数字。事情是,它看起来像它被困在ascii 例如,如果我的号码是12,我只能显示1068 我希望提示能够显示(与printf或写函数)包含在字符串“ abcd12" 。 总之,这里是我的程序(通常至极显示NBR,每次迭代迭代,而他最终值的值到主):将字符串转换为整数

int my_getnbr(char const *str) { 
    int i = 0; 
    int nbr; 
    int power = 1; 

    while (str[i] != '\0') { 
      if (str[i] <= '9' && str[i] >= '0') { 
        nbr = nbr * power + str[i] + '0'; 
        printf("%d\n", nbr); 
        power = power * 10; 
      } 
      i++; 
    } 

    return (nbr); 
} 

int main() { 
    int nbr; 

    nbr = my_getnbr("abcd12"); 
    printf("nbr = %d\n", nbr); 

    return (0); 
} 
+1

这表现出未定义的行为,因为'nbr'永远不会被初始化。 – hnefatl

+1

'int nbr = 0; ... nbr = nbr * 10 +(str [i] - '0');'减去''0''(不需要'power') – chux

+1

你把'+'0''代替了' - '0 “'。投票结束为错字。 – dasblinkenlight

回答

1

你的概念是好的,只是一点点微调。

  • 您还没有设置nbr。将其初始化为零,以便您有一个已知的起点。
  • 不需要power。只需将您的数字乘以每次迭代十次即可。
  • 而关键细节:'0'是一个ASCII字符。如果转换到一个整数,它恰好是48号试试这个:

    nbr = nbr * 10 + str[i] - '0'; 
    

是清楚的意图,在硬编码含义而不是价值,应该让你在完成线。

A小调注:

  • 对于代码的清晰度,建议对照范围值时,思维就像一个数学家。你有

    if (str[i] <= '9' && str[i] >= '0') { 
    

    这是没有错的,但需要一个心理秒钟说:“啊,如果它是一个ASCII数字然而,如果你重新排序,如:。

    if ('0' <= str[i] && str[i] <= '9') { 
    

    对称性更自然,和直观地变量正在测试的界限之间。一个小细节,在根据经验,问题。

+0

'0'<= str [i]可怕的风格。恨它 –

+1

@ PeterJ_01你不会是第一个。而不是可怕的风格,尤其是在C中。或许你会喜欢一种不同的风格。考虑[学习的首要](https://en.wikipedia.org/wiki/Principles_of_learning#Primacy)是我喜欢它并且讨厌它的一个原因。但显然,只有一个“正确”的方式来做到这一点。 “我的方式!“;-) – hunteke

+0

但代码无法正常工作 –

-1

可以简化为:

nbr = 0; 
while (*str) { 
     if (isdigit(*str)) 
     { 
       nbr *= 10; 
       nbr += *str++ - '0'; 
     } 
}