【问题标题】:C scanf format string warningC scanf 格式字符串警告
【发布时间】:2012-01-19 00:35:38
【问题描述】:

我正在研究 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;
}

【问题讨论】:

    标签: c scanf format-string


    【解决方案1】:

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

    scanf("%lu",&greatest);
    

    【讨论】:

      【解决方案2】:

      您将一个整数传递给scanf()

      scanf("%li",greatest);
      

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

      scanf("%lu", &greatest);
      

      【讨论】:

      • 不正确。将 scanf 与不正确的格式说明符一起使用会导致 Undefiend 行为。 printfscanf 格式不安全。用户需要注意它,在这种情况下应该是 lu
      • Als:哈!我正忙着注意到丢失的&amp;,我忽略了unsigned。谢谢!
      【解决方案3】:

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

      scanf("%li", &greatest);
      

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

      scanf("%lu", &greatest);
      

      【讨论】:

      • 不正确。将 scanf 与不正确的格式说明符一起使用会导致 Undefiend 行为。 printfscanf 格式不安全。用户需要注意它,在这种情况下它应该是 lu
      • 使用 %li 摆脱了错误并给了我正确的答案。我确实理解为什么 %lu 是正确的。谢谢!
      • 鉴于 bestPrime 需要一个有符号的 long,您最好将最大类型更改为 long int,但是,因为您发现无符号素数会给您提供更大范围的值可以测试。
      【解决方案4】:

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

      scanf("%lu", &greatest);
      

      编辑:另外,%li 应该是%lu,因为greatest 是无符号的。

      【讨论】:

      • 不正确。将 scanf 与不正确的格式说明符一起使用会导致 Undefiend Behavior。 printfscanf 格式不安全。用户需要注意它,在这种情况下应该是 lu
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-27
      • 2013-08-29
      • 1970-01-01
      相关资源
      最近更新 更多