我正在研究Euler#3(http://projecteuler.net/problem=3)。我认为我的逻辑是正确的,但是在尝试使用scanf(和printf)时遇到错误。我目前正在尝试使用%li,这是我得到的错误:
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;
}
答案 0 :(得分:7)
scanf
正在寻找指向长整数(long int *
)的指针,而不是长整数,因此您需要使用{{1}传递greatest
的地址运算符:
&
正如另一个答案所示,您需要使用scanf("%li", &greatest);
,因为您正在使用%lu
:
unsigned long int
答案 1 :(得分:3)
使用%lu
格式,因为它代表的是unsigned long int
,而不仅仅是long int
scanf("%lu",&greatest);
答案 2 :(得分:1)
为了让scanf
修改你的变量,它需要它的地址(指向你变量的指针)。使用greatest
运算符传递&
的地址:
scanf("%lu", &greatest);
编辑:此外,%li
应该是%lu
,因为greatest
是无符号的。
答案 3 :(得分:1)
您将整数传递给scanf()
:
scanf("%li",greatest);
您应该传递正确输入的变量的地址以保存无符号长整数:
scanf("%lu", &greatest);