printf() 无格式字符串打印字符和整数数组 --> 垃圾

2024-03-07

我想知道为什么printf()当提供数组且没有格式化选项时,会成功打印字符数组,但在使用整数数组时,编译器会抛出警告并打印垃圾值。

这是我的代码:

#include <stdio.h>

int main()
{
   char cr[3] = { 'a', 'b' };
   int ar[3] = { 1, 2 };

   printf("character array output using printf() : ");
   printf(cr);

   printf("\n\nInteger array output using printf() : ");
   printf(ar);
   printf("\n");

   return 0;
}

这是我的输出:

../main.c: In function ‘main’:
../main.c:12:4: warning: passing argument 1 of ‘printf’ from incompatible pointer type [enabled by default]
    printf(ar);
    ^
In file included from ../main.c:1:0:
/usr/include/stdio.h:362:12: note: expected ‘const char * restrict’ but argument is of type ‘int *’
 extern int printf (const char *__restrict __format, ...);
            ^
Finished building: ../main.c

为了回答到底发生了什么,我想首先展示你的数组初始化的作用。您的数组初始值设定项列表不完整,由于大小大于列表而缺少元素。这将导致缺失元素的零初始化 https://stackoverflow.com/a/201116/8051589.

1. char cr[3] array:

char cr[3] = { 'a', 'b' };

将导致:

     character represantation      ==       decimal representation
-+----+----+----+----+----+----+-      -+----+----+----+----+----+----+-
 |    | a  | b  | \0 |    |    |        |    | 97 | 98 | 0  |    |    | 
-+----+----+----+----+----+----+-      -+----+----+----+----+----+----+-
       ^~~~                                   ^~~~
       | char                                 | char
       cr                                     cr

The printf()函数定义为:int printf( const char* format, ... ); http://en.cppreference.com/w/cpp/io/c/fprintf。 这意味着需要一个char指针,并且不会更改所指向的元素。

如果您现在通过了cr数组到printf()功能数组名称将衰减为指针 https://stackoverflow.com/questions/33291624/why-do-arrays-in-c-decay-to-pointers. The printf()函数解释了format参数为以 null 结尾的字符数组,称为 C 字符串 https://en.wikipedia.org/wiki/Null-terminated_string. Your crarray 是一个以 null 结尾的 C 字符串,因为它由以下部分组成{ 'a', 'b', '\0' }。这意味着printf()函数可以成功打印字符串"ab"到标准输出。

2. int ar[3] array:

int ar[3] = { 1, 2 };

将导致:

-+----+----+----+----+----+----+-
 |    | 1  | 2  | 0  |    |    | 
-+----+----+----+----+----+----+-
       ^~~~
       | int
       ar

目前,与第一种情况相比,您没有看到很大的差异(只是类型和内容)。但现在你正在通过ar数组到printf()功能。数组名称将衰减为int*并隐式转换为const char*(这将为您带来编译器警告你有)。如果printf()函数现在取消引用内存,如下所示(假设int由 4 个字节组成,您的机器使用小端存储表示 https://en.wikipedia.org/wiki/Endianness):

-+----+----+----+----+----+----+----+----+----+----+----+----+----+-
 |    | 1  | 0  | 0  | 0  | 2  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 
-+----+----+----+----+----+----+----+----+----+----+----+----+----+-
       ^~~~~~~~~~~~~~~~~~~ ^~~~~~~~~~~~~~~~~~~ ^~~~~~~~~~~~~~~~~~~
       |                int                 int                  int
       ^~~~ ^~~~ ^~~~ ^~~~ ^~~~ ^~~~ ^~~~ ^~~~ ^~~~ ^~~~ ^~~~ ^~~~
       | char char char char char char char char char char char char
       ar

而不是得到像这样的字符串"12"打印后,它将消耗两个左边的字符,即十进制值 1 和 0(空终止符),请参见上图。 1和0之后剩余的十进制值为not按空终止符后面的位置进行识别。假设您的机器使用ASCII 表 http://www.asciitable.com/小数 1 不是可打印字符,会导致打印垃圾值。


概念证明:

为了证明我写的内容,您可以使用以下函数,该函数的第一个参数与printf(),即const char*:

void printhexchars(const char* str)
{
   while(*str)
   {
      printf("%03d ", *(str++));
   }
   /* print last character after while loop: '\0' */
   printf("%03d ", *str);
}

此函数打印以 null 结尾的 C 字符串的整数表示形式。看你的数组的例子char cr[3] and int ar[3]在 ideone.com 上 https://ideone.com/qSnTo2。当然,将整数数组传递给上面的函数将生成与之前相同的编译器警告。

Output:

character array output using printf() : 097 098 000 

Integer array output using printf() : 001 000

正如你所看到的,你得到了097 098 000这是"ab"为你的字符数组。
你的整数数组导致001 000这会导致十进制值为 1 的不可打印字符。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

printf() 无格式字符串打印字符和整数数组 --> 垃圾 的相关文章

  • 从实体获取单列

    如何从查询中获取单个列而不是整个对象 我可以这样做来获取整个对象 但我想要的只是名称 IList
  • 使用 Xamarin.Forms 和 Zxing 生成 QR 码

    我在网上看到了很多关于这个的内容 旧帖子 但似乎没有什么对我有用 我正在尝试从字符串中生成二维码并将其显示在应用程序中 这就是我一开始的情况 qrCode new ZXingBarcodeImageView BarcodeFormat Ba
  • 如何调整 Windows 窗体以适应任何屏幕分辨率?

    我知道这是重复的问题 但我检查了所有其他相关问题 他们的答案没有帮助 结果仍然与屏幕截图 2 中所示相同 我是 C Windows 窗体新手 如截图1所示 我有Form1有一些控件 每组控件都放在一个面板中 我在 PC1 中设计了应用程序
  • 具有多个谓词的 C++11 算法

    功能如std find if来自algorithmheader 确实很有用 但对我来说 一个严重的限制是我只能为每次调用使用 1 个谓词count if 例如给定一个像这样的容器std vector我想同时应用相同的迭代find if 多个
  • 为什么 C# 中同一类型的隐式和显式运算符不能共存? [复制]

    这个问题在这里已经有答案了 为什么同一类中两个相同类型的运算符 显式和隐式 不能共存 假设我有以下内容 public class Fahrenheit public float Degrees get set public Fahrenhe
  • 虚拟并行端口模拟器

    在我的计算机网络课程中 我们应该通过使用本机寄存器 例如使用 outportb 等命令 来学习并行端口编程 我没有并行端口 因为我住在 2011 年 但想练习这些程序 我使用 dosbox 安装了旧的 Turboc 3 IDE 有没有一个程
  • Nhibernate:连接表并从其他表获取单列

    我有以下表格 create table Users Id uniqueidentifier primary key InfoId uniqueidentifier not null unique Password nvarchar 255
  • 关闭整数的最右边设置位

    我只需要关闭最右边的设置位即可 我的方法是找到最右边位的位置 然后离开该位 我编写这段代码是为了这样做 int POS int n int p 0 while n if n 2 0 p else break n n 2 return p i
  • 检测 TextBox 中的 Tab 键按下

    I am trying to detect the Tab key press in a TextBox I know that the Tab key does not trigger the KeyDown KeyUp or the K
  • 如何对STL向量进行排序?

    我想排序一个vector vector
  • 选择 asp.net CheckBoxList 中的所有项目

    ASP NET 和 C 我想要一个带有 全选 项目的复选框列表 当这个特定项目是 已选择 所有其他都将被选择 也 当选择被删除时 这个项目 也将来自所有人 其他物品 选中 取消选中 任何其他项目只会有一个 对特定项目的影响 无论选择状态如何
  • 在 Qt 中播放通知(频率 x)声音 - 最简单的方法?

    Qt 5 1 或更高版本 我需要播放频率为 x 的通知声音 n 毫秒 如果我能像这样组合音调那就太好了 1000Hz 持续 2 秒 然后 3000Hz 持续 1 秒 最简单的方法是使用文件 WAV MP3 例如如此处所述 如何用Qt播放声音
  • 如何测试某些代码在 C++ 中无法编译? [复制]

    这个问题在这里已经有答案了 可能的重复 单元测试编译时错误 https stackoverflow com questions 605915 unit test compile time error 我想知道是否可以编写一种单元测试来验证给
  • 用数组或向量实现多维数组

    我想使用单个数组或向量实现多维数组 可以像通常的多维数组一样访问它 例如 a 1 2 3 我陷入困境的是如何实施 操作员 如果数组的维数为 1 则 a 1 应该返回位于索引 1 处的元素 但是如果维数大于一怎么办 对于嵌套向量 例如 3 维
  • 时间:2019-03-17 标签:c#TimerStopConfusion

    我想通过单击按钮时更改文本颜色来将文本框文本设置为 闪烁 我可以让文本按照我想要的方式闪烁 但我希望它在闪烁几次后停止 我不知道如何在计时器触发几次后让它停止 这是我的代码 public Form1 InitializeComponent
  • 与 Entity Framework Core 2.0 的一对零关系

    我正在使用 C 和 NET Framework 4 7 将 Entity Framework 6 1 3 Code First 库迁移到 Entity Framework Core 我一直在用 Google 搜索 Entity Framew
  • 运行 xunit 测试时无法将输出打印到控制台窗口

    public class test2InAnotherProject private readonly ITestOutputHelper output public test2InAnotherProject ITestOutputHel
  • 如何知道 HTTP 请求标头值是否存在

    我确信这很简单 但是却让我感到厌烦 我在 Web 应用程序中使用了一个组件 它在 Web 请求期间通过添加标头 XYZComponent true 来标识自身 我遇到的问题是 如何在视图中检查此组件 以下内容不起作用 if Request
  • 如何在 Razor 编辑视图中显示选中的单选按钮 Asp net core mvc

    尽管 Razor 视图中的 Asp 网络核心代码 model List
  • 是否可以使用 Dapper 流式传输大型 SQL Server 数据库结果集?

    我需要从数据库返回大约 500K 行 请不要问为什么 然后 我需要将这些结果保存为 XML 更紧急 并将该文件通过 ftp 传输到某个神奇的地方 我还需要转换结果集中的每一行 现在 这就是我正在做的事情 TOP 100结果 使用 Dappe

随机推荐

  • Symfony 2 - 在 Amazon S3 上上传图像的最佳实践

    我有一个表格 其中有一个file字段上传图像 我需要将此图像上传到 Amazon S3 一步一步构建这个 我开始将图像上传到本地磁盘上 现在它可以工作了 上传发生在我的实体内部Page因为建议在保存实体之前测试上传是否成功 我最终得到了这段
  • Firebase 检索嵌套数据

    我在尝试从 Firebase 检索时遇到了一些麻烦 基本上我的组表是这样的 在这种情况下 根据group ID KpFibCHjJ1xpfLd07WJ 有一个account ID KpFiX2L7ENt6EBgrB0S 右边将会有多个帐户
  • 上传后使用 ExpressJS 将文件存储在 Mongo 的 GridFS 中

    我已经开始使用expressJS 构建REST api 我是节点新手 所以请耐心等待 我希望能够让用户使用 upload 路由的帖子将文件直接上传到 Mongo 的 GridFS 根据我在expressJS文档中的理解 req files
  • 如何使用 JPA 2.1 转换连接的元素集合?

    我有3张桌子user user team and team user id number name varchar team name varchar user team user id number FK gt user id team
  • Mercurial Eclipse 错误

    我正在尝试在 Eclipse 中使用 Mercurial 我为此下载了 Mercurial Eclipse 插件 但是 尽管我重新安装了很多次 但还是出现同样的错误 我将屏幕截图放在下面 Checking encoding cp1254 C
  • 检查 rsync 命令是否运行成功

    以下 bash 脚本每小时执行一次文件夹的 rsync bin bash rsync r z c home pi queue email protected cdn cgi l email protection home foobar rm
  • Urllib2 中的代理身份验证错误 (Python 2.7)

    Windows 7 64 位 Python 2 7 如果我尝试使用 Urllib2 我会收到此错误 Traceback most recent call last File C Users cYanide Documents Python
  • 如何获取 Mac 版 zipalign?

    我已经有一个未签名版本的 apk 我正在尝试在我的 Mac 上对其进行签名 在最后一步 它建议对签名的 apk 进行 zipalign 但 mac 没有 zipalign 我做了 酿造搜索 仍然找不到它 我在网上搜索 找不到独立的 zipa
  • 在 git 中,有没有办法在不应用存储的情况下显示未跟踪的存储文件?

    如果我跑git stash u 我可以隐藏未跟踪的文件 但是 据说未跟踪的文件根本不会显示git stash show stash 0 有没有办法在不应用隐藏的情况下显示未跟踪的隐藏文件 未跟踪的文件存储在存储提交的第三个父级中 这实际上没
  • 将 Windows 容器(使用 Docker 创建)部署到 Azure 容器服务中

    我正在尝试完成一项关于如何在 Azure 域 环境中正确使用 Windows 容器的体系结构研究 在该域 环境中我必须容器化 Dot Net Core Web API 应用程序并将该容器部署到 Azure 容器服务中 这是我所做的事情 我确
  • Python 为消息添加自定义反应

    我想为多个命令添加多个自定义反应 或者如果我们添加反应列表 它将从该列表中添加随机反应 那么该怎么做呢 from discord utils import get 按名称添加表情符号 reactions emoji name 1 emoji
  • 如何消除视频中剧烈的亮度变化?

    我有从摄像机获得的图像流 我发现有时来自流的图像的亮度会出现很大的峰值 每个像素的值都会跳跃或下降 然后在下一个图像中返回到正常的亮度级别 这对我的算法来说是一个大问题 有什么办法可以防止这种亮度峰值吗 我正在考虑在每个像素上使用低通滤波器
  • 什么Python代码为二元运算符生成所有可能的分组(树)

    正如几个 SO 问题中所解释的 更抽象的是数学世界 http mathworld wolfram com BinaryBracketing html 加泰罗尼亚数字的序列恰好对应于可以为任何给定数量的运算符生成的括号分组的数量 但我还没有找
  • matlab中使用symsum求级数之和

    我有以下系列 我尝试了这段代码 但它没有打印最终结果 而是给出了一长串数字 syms n y symsum 1 sqrt n 1 100 Result y 2 1 2 2 3 1 2 3 5 1 2 5 6 1 2 6 and so on
  • JSF 2.0:何时调用encodeAll以及何时调用encodeBegin?

    考虑一个自定义 UIComponent 仅用于测试目的 public class UITest extends UIComponentBase Override public void encodeBegin FacesContext co
  • 将资源合并到单个二进制文件中

    如何将应用程序的多种资源 图像 声音 脚本 xml 等 组合到一个 多个二进制文件中 以便保护它们不被用户窃取 典型的步骤是什么 组织 加载 加密等 这在游戏开发中尤其常见 但许多游戏框架和引擎并没有提供一种简单的方法来做到这一点 也没有描
  • org.apache.axis2.AxisFault 连接被拒绝

    我在尝试从客户端应用程序订阅服务时收到以下错误 有人可以告诉我这个异常的原因吗 提前致谢 org apache axis2 AxisFault Conexi n rehusada at org apache axis2 AxisFault
  • 黑莓操作系统版本

    如果我为操作系统版本 6 0 开发 Blackberry 应用程序 该应用程序是否与操作系统版本 4 5 兼容 如果没有 是否有某种方法可以轻松移植应用程序 如果您针对特定 SDK 例如 6 0 进行开发 您的应用程序将只能部署到使用匹配操
  • 为什么 Django blocktrans 在一个地方工作而不是在另一个地方工作?

    我有两个 Django 模板 在 Pinax 0 9 x 项目中 其中的文本blocktrans堵塞 一个正在工作 另一个则没有 正在工作的看起来像 extends site base html block body h1 ABC h1 h
  • printf() 无格式字符串打印字符和整数数组 --> 垃圾

    我想知道为什么printf 当提供数组且没有格式化选项时 会成功打印字符数组 但在使用整数数组时 编译器会抛出警告并打印垃圾值 这是我的代码 include