2017-06-04 124 views
1

我想乘以2整數,我總是得到一個負數,有人可以幫助我嗎? (具有這種功能,我想從這個字符串,使「3924456639」一個整數)C OVERFLOW!數字變負

這裏是我的代碼:

long temp = 0; 

fgets(buf, sizeof buf, stdin); 

for(int i = 0; i < sizeof buf ;i++){ 
    if(buf[i] != ' ' && buf[i] != '\n'){ 
    temp *= 10;// <- gets negative 
    temp = temp + buf[i] - '0'; 

    }} 
+4

更改爲無符號長整型。 – stark

回答

4

您需要檢查什麼的sizeof(長)您的系統上,它可能是4

32位長變量將舉行最大值爲2147483647,如果你存儲在它更大的價值將在負的範圍內去,所以你需要聲明temp unsigned long類型

+0

謝謝你的回答,我用這段代碼試了一下: int m = 3924456639; unsigned long m1 =(long)3924456639; 012fprintf(「%d \ n」,sizeof m1); printf(「%d \ n」,m1); printf(「%d \ n」,m); 和我有這個輸出: -370510657 -370510657 – bimbam

+0

媽呀,我真是太傻了,謝謝你風向標!!!!! – bimbam

+0

@bimbam改爲'unsigned m = 3924456639u; unsigned long m1 = 3924456639u; printf(「%zu \ n」,sizeof m1); printf(「%lu \ n」,m1); printf(「%u \ n」,m);' –

1

您可以使用strtol 。沒有必要重新發明輪子。

long int strtol(const char *str, char **endptr, int base) 
+0

它與strtol一起工作(所以我得到long int 3924456639)但爲什麼我不能像這樣做:long var = 3924456639; ? – bimbam

+0

你是什麼意思我只是做了很長時間var = 3924456639;它的工作原理@bimbam – KALALEX

+0

你使用哪種編譯器? – KALALEX

1

你的主要問題是,通過所有的緩衝buf的你的循環步驟,而不是僅僅通過其包含的'\0'終止字符串步進。

例如,如果我們假設buf被宣佈爲char buf[100];我們輸入的字符串"3924456639"然後buf將包含:

{'3','9','2','4','4','5','6','6','3','9','\n','\0', ... and 88 bytes of garbage} 

那麼你的循環將通過正確的數字步驟,而忽略'\n'但它並沒有停止。由於'\0'既不是' '也不是'\n'temp得到乘以十和'\0' - '0'被添加。對於88字節的垃圾既不是' '也不是'\n'

爲了解決這個問題,更改:

for(int i = 0; i < sizeof buf ;i++){ 

到:

for(int i = 0; i < strlen(buf) ;i++){ 

或:

for(int i = 0; buf[i] != '\0' ;i++){ 

(如果你想使用strlen()記住#include <string.h>。)

注意:

  • 你的小問題是,long可能太小,你的號碼。
  • 像@KALALEX指出的那樣,您可以使用strtol()