我正在歐拉#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;
}
不正確。使用帶有不正確格式說明符的'scanf'會導致Undefiend行爲。 'printf'和'scanf'不是格式安全的。用戶需要照顧它,在這種情況下,它應該是'lu' –
使用%li擺脫了錯誤並給了我正確的答案。我明白爲什麼%lu是正確的。謝謝! – Alex
鑑於greatestPrime需要很長的簽名,您可能會更好地將最大類型更改爲「long int」,但是,因爲您發現無符號的素數會爲您提供更大範圍的值,您可以對其進行測試。 –