【问题标题】:Argument type error in CC中的参数类型错误
【发布时间】:2024-01-10 19:06:01
【问题描述】:

我应该向用户询问一个 3 位数字,然后用该数字加上 6 模 10 替换每个数字,然后将所有更新数字相加。当我运行程序时,输入数字后它会崩溃,警告:

格式 %d 需要类型为“int *”的参数,但参数 2 的类型为 int。

这是我的源代码:

#include <stdio.h>

int main(int argc, char* argv[])
{
   int Integer;
   int Divider;
   int Digit1, Digit2, Digit3;

   printf("Enter a three-digit integer: ");
   scanf("%d", Integer);

   Divider = 1000;
   Digit1 = Integer / Divider;

   Integer = Integer % Divider;
   Divider = 100;
   Digit2  = Integer / Divider;

   Integer = Integer % Divider;
   Divider = 10;
   Digit3  = Integer / Divider;


      Digit1 = (Digit1 + 6) % 10;
      Digit2 = (Digit2 + 6) % 10;
      Digit3 = (Digit3 + 6) % 10;

   printf(Digit3 + Digit1 + Digit2);

   getch();
   return 0;
}

更新

在我们的示例输出中,如果用户输入928,则结果数字应为584。我不确定这个数字是如何产生的。它应该用那个数字加上 6 模 10 的总和来替换每个数字。那么我的代码中是否也存在数学错误?

【问题讨论】:

  • 为避免进一步的问题,请勿使用scanf 进行用户输入。请改用fgets
  • 注意C程序不叫脚本;该术语是为没有生成可执行文件的正式编译器的编程语言保留的(例如 shell、Awk、Perl、Python 等)。它们是程序、源文件或类似的东西。
  • 不使用main()的参数时,则使用签名:int main( void )
  • 函数:scanf() 需要其参数的地址,因此它知道将转换后的输入放置在何处。所以这一行:scanf("%d", Integer); 应该是:scanf("%d", &amp;Integer); 另外,请始终检查返回值以确保操作成功。 IE。 `if(1!=scanf("%d", &Integer)) { perror("scanf failed");退出(EXIT_FAILURE); } 注意:在 stdlib.h 中找到 exit() 和 EXIT_FAILURE
  • 函数:printf() 期望第一个参数是format string 所以建议:printf( "%d %d %d", DIgit3, Digit1, Digit2 );

标签: c compiler-errors scanf


【解决方案1】:

几个地方:

scanf("%d", &Integer);
printf("%d\n", Digit3 + Digit1 + Digit2);
getchar();  // maybe??

事实上,编译器已经为你清楚地指出了它们:

warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘int’ [-Wformat=]
    scanf("%d", Integer);
    ^

warning: passing argument 1 of ‘printf’ makes pointer from integer without a cast [enabled by default]
    printf(Digit3 + Digit1 + Digit2);
    ^

warning: implicit declaration of function ‘getch’ [-Wimplicit-function-declaration]
    getch();
    ^

注意,关于getch,您可以在此处进一步阅读:implicit declaration of function 'getch'

在这些修复之后,您的程序可以正常运行。让我叫固定源文件z.c

gcc -std=gnu99 -O2 -o z z.c
./z

如果我输入304,我会得到21


补充说明:

您希望Divider 成为100101,而不是100010010

【讨论】:

  • 用于优化的编译器标志,但没有启用警告?
  • 我的意思是,只要您展示编译器调用,最好展示那些 C 新手至少 -Wall -Wextra,这将帮助他们捕获很多错误。除了-pedantic 之外,我个人几乎每次调用 gcc 时都会使用这些。
  • 您是正确的,代码运行正常,但是它产生的结果与我应该得到的结果不同。我的数学或对问题的理解是否有错误?因为在我们的示例输出中,如果用户输入 928,则结果数字应该是 584。我不确定这个数字是如何产生的。它应该用该数字加上 6 模 10 的总和替换每个数字。那么我的代码中是否也存在数学错误?
【解决方案2】:

当你使用scanf将值读入变量时,需要传递变量的地址,这样scanf才能改变变量的值。

scanf("%d", &Integer);

& 符号传递变量的地址。

【讨论】:

    【解决方案3】:

    欢迎来到 C,希望你会喜欢它。

    您似乎忘记了&amp;。 请使用scanf("%d", &amp;Integer) 而不是scanf("%d", Integer)。在 C 语言中,大多数变量被引用为指针,因此当您希望通过 scanf 分配整数或浮点数时,您必须使用“&”来尊重它。

    【讨论】: