2014-09-28 60 views
0

我寫的代碼如下:計劃將字符串轉換爲整數

#include<stdio.h> 
#include<math.h> 
#include<string.h> 
int strToint(char []); 
int main() 
{ 
    char str[20]; 
    printf("Enter the string-"); 
    gets(str); 
    printf("\nthe integer is %d ",strToint(str)); 
    return 0; 
} 
int strToint(char str[]) 
{ 
    int i,a,sum=0,k,j; 
    a=strlen(str); 
    for(i=0;i<a;i++) 
    { 
     k=str[i]-'0'; 
     j=pow(10,a-i-1); 
     sum+=k*j; 
    } 
    return sum; 
} 

如果我進入輸入作爲,說567,我得到562,但我不明白爲什麼。我覺得這可能與pow功能有關。

幫助表示讚賞。謝謝!

+0

你根本就用aoit功能爲這種轉換...總和=的atoi(STR); – 2014-09-28 19:59:33

+1

我得到了一個正確的答案:http://ideone.com/4Ae89x – 2014-09-28 19:59:39

+0

對於輸入「567」我得到輸出567與您的代碼。一切似乎都奏效。 – nem035 2014-09-28 20:00:05

回答

2

pow()是一個浮點函數,其行爲因系統而異。標準對其準確性沒有要求。看起來你並沒有以你需要的精確度返回值。

您不需要實現將文本轉換爲整數的函數,因爲標準庫包含這樣做的函數。一個明顯的選擇是sscanf

但是,如果你必須實現這樣的功能,你應該使用整數算術。任何這樣的代碼都應該處理負值,並檢查無效輸入。例如。當你將"a"傳遞給你的函數會發生什麼?

+0

謝謝大衛!我假設用戶輸入了有效的輸入。 – 2014-09-28 20:12:37

+0

如果第二個參數是「0」,則'pow'需要返回'1.0'。所以看起來這不符合C的實現。 – 2014-09-28 20:13:47

+0

@Jens我寧願想像那是pow的其他調用會失​​敗。同樣,這裏的浮點數是錯誤的。 – 2014-09-28 20:19:35

2

我測試了你的代碼並得到了預期的結果。也許問題與功能pow有關。

您可以在不使用處理實數的函數的情況下編寫簡單的函數。

例如

int strToint(const char str[]) 
{ 
    int sum = 0; 

    for (; *str; ++str) 
    { 
     sum = 10 * sum + *str - '0'; 
    } 

    return sum; 
} 

考慮到發揮功能gets是不安全的帳戶。最好使用功能fgets。例如

fgets(str, 20, stdin); 

size_t n = strlen(str); 
if (str[n - 1] == '\n') str[n - 1] = '\0'; 
+0

這很好,謝謝! :) – 2014-09-28 20:27:50

+0

@Pranav Arora查看我更新的帖子。 – 2014-09-28 20:35:07

+0

再次感謝你,我不知道'fgets'。 :) – 2014-09-28 20:42:56

1

在以pow(10,2)第一次調用庫中的薄弱pow()收益99.999 ...這是截斷爲99的分配j

由於第一個數字是5,所以最終總和減少了5。 (100 * 5比99 * 5)

如果代碼必須使用FP功能,最好圓整轉讓前

j = round(pow(10,...)); 

由於@Vlad指出,可以避免所有FP數學。

-

C不要求浮點函數是正確的。 A pow()功能雖然應該在這裏提供了一個確切的答案,這就是爲什麼它在許多其他機器上工作。

對於一個完整的atoi,有很多的職位,如FromStringToInteger