【问题标题】:Scanf not compilingScanf没有编译
【发布时间】:2021-11-18 08:34:43
【问题描述】:

我是 C 新手,在使用 gcc 在 Ubunto 上编译以下代码时遇到了一个奇怪的问题。

#include <stdio.h>
int main()
{
    char c;
    printf("Inserire la codifica numerica :");
    scanf(" %d",&c);
    printf("La traduzione é %c\n",c);
    return 0;
}

编译代码时出现以下错误:

$ gcc codbin.c -o codbin.out
codbin.c: In function ‘main’:
codbin.c:7:14: warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘char *’ [-Wformat=]
    7 |     scanf(" %d",&c);
      |             ~^  ~~
      |              |  |
      |              |  char *
      |              int *
      |             %hhd

但它应该基于我们的教授在大学课程中告诉我们的内容。有什么想法吗?

在此先感谢,任何帮助将不胜感激!

【问题讨论】:

  • c 已被声明为字符,字符的适当格式说明符为 %c - %d 用于整数。另外,这只是一个警告,代码已经编译成功。
  • 如果你想读取一个字符,请使用%c。如果你想读取一个小整数,请使用%hhd(但请注意,char 是有符号还是无符号取决于编译器,所以我建议uint8_t 用于无符号字节,int8_t 用于有符号字节)。跨度>

标签: c scanf


【解决方案1】:

我认为错误消息异常清晰。

%d 需要 int

但是您提供的变量c 被声明为char

char c;

我非常怀疑你的教授说这没问题,但如果他们这样做了,他们就完全错了。

带有% 标识符的格式字符串必须与提供的参数匹配。

【讨论】:

  • 强调“完全错误”。如果参数的类型与转换说明符不匹配,则结果是未定义的行为。未定义的行为有时会表现为您所期望的行为。对于刚学习语言的人来说,这是一个危险的陷阱。
【解决方案2】:

首先,这只是一个警告,意味着您的代码仍应编译,因此请检查文件 codbin.out 是否存在。

如果没有,您可能遇到了其他未向我们展示的问题。

其次,正如已经指出的那样,警告的原因是您的格式说明符“%d”与变量类型char不匹配。

“%d”希望您提供指向 int 变量的指针。

没有人告诉你的是,你的程序仍然可以运行,但这只是侥幸。

因为char 小于intscanf 可能会尝试写入它不应该使用的内存。 这称为“未定义行为”,这意味着它可能会根据您使用的编译器、运行的操作系统以及运行程序时计算机的状态而改变。

即使代码错误,您的程序也可能会崩溃、打印一些奇怪的东西或正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 2013-06-07
    • 2017-08-28
    • 2014-07-17
    相关资源
    最近更新 更多