【问题标题】:Is the below given code is wrong?下面给出的代码是错误的吗?
【发布时间】:2018-08-19 14:27:24
【问题描述】:
#include <stdio.h>

int main()
{
    int a;
    printf(scanf("%d",&a));
    return 0;
}

我收到此消息“分段错误(核心转储)”

【问题讨论】:

  • 您正在将 scanf 的 int 返回值传递给 printf(),它需要一个字符串指针作为第一个参数:BANG。不要编写“聪明”的代码——它只会导致问题。
  • 您没有为printf 提供格式说明符。例如:printf("%d", scanf("%d",&amp;a)); 当然,这不会像您想的那样打印。

标签: c gcc


【解决方案1】:

printf() 函数的格式是:-

printf(const char *format, ...)

您必须提供一个字符串带有格式说明符的格式字符串)作为函数printf() 的参数。

你可以试试:-

printf("%d",scanf("%d",&a)); // with format string

如果扫描成功,这将打印 1 。这里%d格式字符串integer 参数。

要读取和打印变量a,请尝试:-

 scanf("%d",&a);  // reading
 printf("%d",a);  // printing

【讨论】:

    【解决方案2】:

    阅读您的编译器警告。

    prog.c:8:12: warning: passing argument 1 of ‘printf’ makes pointer from integer without a cast [-Wint-conversion]
         printf(scanf("%d",&a));
                ^~~~~
    

    printf 想要一个字符串作为第一个参数。你给它一个整数。

    【讨论】:

      【解决方案3】:

      你想打印'a',所以你应该这样做

      scanf("%d",&a);
      printf("%d", a);
      

      scanf() 返回写入的字符总数link

      【讨论】:

        【解决方案4】:

        scanf 查看您的格式字符串,看到%d 并将其与int地址进行匹配,您提供了&amp;a。如果在尝试读取值时出错,scanf 将返回 EOF,否则它将成功匹配的项目数返回为 int。例如,如果您输入123,则scanf("%d", &amp;a) == 1 为真,但如果您输入q123,则scanf("%d", &amp;a) == 0 为真。

        printf 需要一个格式字符串,就像scanf 一样,它使用该格式来打印参数的值。它无法知道用于scanf 的格式与您也想用于打印的格式相同,并且您没有提供一个字符串,它是一种指针,包含打印参数的格式。这是您的代码的问题。

        整数,例如scanf 返回的int 值,可以转换为指针,而无需告诉编译器执行转换。因此,编译器可能会抱怨您正在做一些可能有问题的事情(警告:传递 'printf' 的参数 1 会在没有强制转换的情况下从整数中生成指针),但该代码将被允许编译并执行。

        当您看到这样的警告时,请查看函数对该参数要求的类型以及您用作该参数的值的类型。编译器试图帮助您避免像printf(scanf("%d", &amp;a));这样的错误的机会很大

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-12-20
          • 1970-01-01
          • 2021-08-21
          • 1970-01-01
          • 2020-12-23
          • 2018-12-29
          • 2019-11-24
          相关资源
          最近更新 更多