3

我正在研究 Euler #3 ( http://projecteuler.net/problem=3 )。我认为我的逻辑是正确的,但是在尝试使用 long 的 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;
}
4

4 回答 4

7

scanf正在寻找指向长整数 ( long int *) 的指针,而不是长整数,因此您需要greatest使用&运算符传递地址:

scanf("%li", &greatest);

正如另一个答案所示,您需要使用%lu,因为您正在使用unsigned long int

scanf("%lu", &greatest);
于 2011-12-13T03:52:28.527 回答
3

使用%lu格式,因为它代表一个unsigned long int而不仅仅是一个long int

scanf("%lu",&greatest);
于 2011-12-13T03:52:35.653 回答
1

为了scanf修改您的变量,它需要它的地址(指向您的变量的指针)。传递greatest使用&运算符的地址:

scanf("%lu", &greatest);

编辑:另外,%li应该是%lu,因为greatest没有签名。

于 2011-12-13T03:54:03.030 回答
1

您将整数传递给scanf()

scanf("%li",greatest);

您应该传递正确键入的变量的地址以保存无符号长整数:

scanf("%lu", &greatest);
于 2011-12-13T03:54:23.427 回答