2017-10-19 276 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'; 
     } 
}