C语言——printf打印字符串(关于数据在内存中存储格式的体现)

原创 2018年04月17日 00:14:13

PS:本篇文章,是笔者在C语言学习过程中的所产生疑惑的地方,经过查阅相关资料得出的结论,如有错误的地方,还望指出改正。

int 占4个字节, 这里输入的8位16进制数每相邻两位数代表一个字节。如:44,43,42,41

int b = 0x41424344;
printf("string: %s\n", &b);

注意:%s打印字符串的时候,必须要求printf所传参数必须是一个内存的地址,且一定有一个0(代表字符串结尾标志‘\0’)做为截至条件。而这里并没有以0结尾所以,这两行代码除了输出各个字节的ASCII码对应的字符以外还会输出这片存储区域后面的的内存所存储的数据(是不可预见的)知道遇到0为止。
我的电脑是小端存储系统,所以输出结果为:
这里写图片描述

下面来看看这些代码:

    int b = 0x41424344;
    int b1 = 0x41424300;
    int b2 = 0x00414243;
    int b3 = 0x41004243;

    printf("string: %s\n", &b);
    printf("string: %s\n", &b1);
    printf("string: %s\n", &b2);
    printf("string: %s\n", &b3);

要记住,%s输出字符串的时候遇到0或‘\0’,就会被截断,只输出0或‘\0’前面的字符,所以,这里b1的最低位为0,则b1没有字符可以输出。b2, b3同理。
如图:这里写图片描述

同样的道理,如下代码:

char arr[4] = {0x41, 'X', '0', 'C'};
        printf("string: %s\n", arr);

由于arr[4]数组只有4个元素,由于赋值的时候就给四个元素都赋了值,数组中就没有元素再来存储结束符‘\0’,所以,同样输出完数组后会有乱码产生。
如图:
这里写图片描述

最有意思的是这两行代码:

int arr[] = {0x41, 'm', 'X', '0', 'C', '\0'};
        printf("string: %s\n", arr);

看上去,在数组的末位手动添加了字符串结尾标志符,以为正常输出:AmX0C
其实不然。
这里写图片描述
这里我给出了,前两个数据在内存中存储的格式,由于int占4个字节,所以0x41只是占用了第一个元素4个字节的第一个字节,所以后面的三个字节由系统自动补0,所以编译器在编译的时候,任然是碰到0就截止。就导致,最终程序只能输出,0x41所对应的字符 ‘A’.
如图:
这里写图片描述

下面提供两种可以正确输出的方式:

    char arr[5] = {0x41, 'm', 'X', '0'};
    char arr2[] = "AX0C";
    printf("string: %s\n", arr);
    printf("string: %s\n", arr2);

这里写图片描述

打印数据在内存中的二进制存储格式

本来是在>第一卷看到的一个代码。当时对自己触动非常大。今天在论坛看到有人问类似的东西,就按那个想法自己用c语言写了一个,算是做个小小的纪念:#include stdio.h>void printBin...
  • jcwKyl
  • jcwKyl
  • 2008-04-08 12:56:00
  • 1777

C语言中printf输出的奇怪错误 http://segmentfault.com/q/1010000002534752

C语言中printf输出的奇怪错误 jujuup 18 2015年02月04日 提问 关注 5 关注 收藏 1 收藏,2.3k 浏览 问...
  • wangyin159
  • wangyin159
  • 2016-01-28 10:09:01
  • 1136

C语言Printf格式大全(各种%输出形式)

C语言Printf格式   C中格式字符串的一般形式为: %[标志][输出最小宽度][.精度][长度]类型, 其中方括号[]中的项为可选项。各项的意义介绍如下: 1.类型类型字符...
  • taxue4485
  • taxue4485
  • 2014-11-01 20:51:39
  • 3534

Go 语言——字符串、数据的格式化输出(Printf)

直接看代码: //字符串输出 var sayHi string = "hello world" fmt.Println(sayHi) // \ 转义 fmt.Println("hello \nw...
  • fanxiangru999
  • fanxiangru999
  • 2017-09-27 20:48:30
  • 396

使用printf输出各种格式的字符串

 分类: +--------------------------------------------+ | 主题: 使用printf输出各种格式的字符串           | | ...
  • ccpqpq
  • ccpqpq
  • 2015-04-25 11:02:28
  • 4818

c语言输入输出函数printf与scanf的用法格式

c语言输入输出函数printf与scanf的用法格式,格式化规则例如:%5.4f等类似问题的说明    Turbo C2.0 标准库提供了两个控制台格式化输入、输出函数printf( ) 和scan...
  • yzl_rex
  • yzl_rex
  • 2011-10-20 19:00:00
  • 8349

C printf 格式输出字符串

s格式符:用来输出一个字符串。  %s 用来输出一个字符串,不含双引号. 例:printf("%s","CHINA");  %ms m指定宽度(字符串长度小于m时左补空格,大于时按实际宽度输出) ...
  • hittata
  • hittata
  • 2013-01-23 08:36:57
  • 6721

C语言随笔_printf输出多行

想在printf中,输出多行数据,如果写成下面这样: printf("line 1\n line 2\n line 3\n"); 编译器会报错“error C2001: newli...
  • kelehaier
  • kelehaier
  • 2016-09-14 13:34:18
  • 2101

c语言printf()函数格式化输出

printf的格式控制的完整格式: % - 0 m.n l或h 格式字符 下面对组成格式说明的各项加以说明: ①%:表示格式说明的起始符号,不可缺少。 ②-:有-表示左对齐输出,如省略表示右...
  • mbshqqb
  • mbshqqb
  • 2016-12-04 17:53:49
  • 788
收藏助手
不良信息举报
您举报文章:C语言——printf打印字符串(关于数据在内存中存储格式的体现)
举报原因:
原因补充:

(最多只允许输入30个字)