C scanf格式字符串警告

3

我正在研究欧拉问题#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;
}
4个回答

7

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

scanf("%li", &greatest);

正如另一个答案所示,由于您正在使用无符号长整型,因此需要使用%lu

scanf("%lu", &greatest);

不正确。使用不当的格式说明符与 scanf 结合会导致未定义行为。printfscanf 不是格式安全的。用户需要注意,在这种情况下应该使用 lu - Alok Save
使用 %li 消除了错误并给出了正确的答案。虽然我确实理解为什么 %lu 是正确的。谢谢! - Alex
考虑到greatestPrime接受有符号长整型,你最好将greatest的类型更改为long int。然而,由于你正在查找质数,无符号类型会给你更大的测试值范围。 - Matt Lacey

3

使用%lu格式,因为它表示的是无符号长整型(unsigned long int),而不仅仅是长整型(long int

scanf("%lu",&greatest);

1
为了让 scanf 修改你的变量,它需要该变量的地址(即变量的指针)。使用 & 运算符传递 greatest 的地址:
scanf("%lu", &greatest);

编辑:同时,%li 应该改为 %lu,因为 greatest 是无符号的。


不正确。使用不当的格式说明符与 scanf 结合会导致未定义行为。printfscanf 不是格式安全的。用户需要注意,在这种情况下应该使用 lu - Alok Save

1

你正在向 scanf() 传递一个整数:

scanf("%li",greatest);

您应该传递一个变量的地址,该变量已经正确地声明为能够容纳无符号长整型:

scanf("%lu", &greatest);

不正确。使用不当的格式说明符与 scanf 结合会导致未定义行为。printfscanf 不是格式安全的。用户需要注意,在这种情况下应该使用 lu - Alok Save
Als:哈! 我太忙于注意缺少的 &,却忽略了 unsigned。谢谢! - sarnold

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接