2011-12-13 169 views
3

我正在歐拉#3(http://projecteuler.net/problem=3)上工作。我認爲我的邏輯是正確的,但是在嘗試長時間使用scanf(和printf)時出現錯誤。我現在試圖用鋰%,這是我得到的錯誤:我理解錯誤C scanf格式字符串警告

euler3.c: In function ‘main’: 
euler3.c:30: warning: format ‘%li’ expects type ‘long int **’, but argument 2 has type ‘long int’ 
euler3.c:30: warning: format ‘%li’ expects type ‘long int *’, but argument 2 has type ‘long int’ 

,但對我的生活,我不能找到解決方案。這是我的代碼,如果需要的話。

#include <stdio.h> 

long greatestPrime(long num) 
{ 
     int i; 

     for(i = 2; i <= num; i++) 
     { 
       if(num%i == 0) 
       { 
         num = num/i; 
         i--; 
       } 
     } 

     return num; 
} 

int main(int argc, char *argv[]) 
{ 
     unsigned long greatest; 

     printf("Enter number to find prime factor: "); 
     scanf("%li",greatest); 

     printf("%li",greatestPrime(greatest)); 

     return 0; 
} 

回答

7

scanf正在尋找一個指向一個長整型(long int *),而不是一個長整型,所以你需要使用&運營商通過的greatest地址:

scanf("%li", &greatest); 

至於另一答案顯示,以及,你需要使用%lu,如您使用的是unsigned long int

scanf("%lu", &greatest); 
+0

不正確。使用帶有不正確格式說明符的'scanf'會導致Undefiend行爲。 'printf'和'scanf'不是格式安全的。用戶需要照顧它,在這種情況下,它應該是'lu' –

+0

使用%li擺脫了錯誤並給了我正確的答案。我明白爲什麼%lu是正確的。謝謝! – Alex

+0

鑑於greatestPrime需要很長的簽名,您可能會更好地將最大類型更改爲「long int」,但是,因爲您發現無符號的素數會爲您提供更大範圍的值,您可以對其進行測試。 –

3

使用%lu格式,因爲它代表一個unsigned long int,而不是僅僅一個long int

scanf("%lu",&greatest); 
+1

+1這是正確的答案。 –

1

爲了scanf修改您的變量,它需要它(的一個指針變量)的地址。使用&操作合格greatest地址:

scanf("%lu", &greatest); 

編輯:另外,%li%lu,因爲greatest是無符號。

+0

不正確。使用帶有不正確格式說明符的'scanf'會導致Undefiend行爲。 ''printf''和'scanf'不是格式安全的。用戶需要照顧它,在這種情況下,它應該是'lu' –

+0

@Als:我不知道我是如何忽略它的,修正了它,謝謝。 – AusCBloke

1

你傳遞一個整數scanf()

scanf("%li",greatest); 

你應該通過正確輸入持有的無符號長整型變量的地址:

scanf("%lu", &greatest); 
+0

不正確。使用帶有不正確格式說明符的'scanf'會導致Undefiend行爲。 'printf'和'scanf'不是格式安全的。用戶需要照顧它,在這種情況下它應該是'lu' –

+0

Als:哈!我太忙了,注意到了那個失蹤的'&'我忽略了'unsigned'。謝謝! – sarnold