关于printf 输出字符串的内部运行猜测

本文探讨了printf函数如何处理字符串输出,特别是针对特定整数输入如何转换成字符序列并正确显示的过程。通过对简单示例的分析,揭示了字符串输出背后的内存布局和ASCII码转换原理。

关于printf 输出字符串的内部运行猜测

最普通的一个例子。

char str[10]="hello!";
printf("%s", str);

其中,%s是输出字符串的标志,str是一个地址。这是大家都知道的。再以下是我自己猜测的内容,如果有误希望您能联系我,帮我指出,谢谢。

在系统内存中为str分配了10个字节,str表示其首地址,依次储存的是 h e l l o ! \0 \0 \0 \0 。然后执行printf的时候,读取到%s,让系统知道接下来要用一个读取字符串的方法,输出下面的数据。读取到 str这个首地址时,就以一个字节为单位,依次输出,直到输出的数据值为0为止,即 \0 。故上面的程序段输出结果为 hello! 。

有了这样的猜测,那我们来验证一下。

    ///1094795585 的二进制 0100 0001 0100 0001 0100 0001 0100 0001
    int a[3]={1094795585};
    printf("%s\n",a);
    return 0;

这个程序通过gcc编译运行出来的结果为 AAAA 。
很奇怪是不是,那么就用上面所说的printf的输出字符串的机制来解释下这个问题。
首先,1094795585 这个数字在内存中储存时的二进制代码就是上面写的,由于是int型,每个字节中储存的都是 0100 0001 也就是65,A 的ASCⅡ码值。其次呢,a也是一个地址,是一个空间大小为12个字节的首地址。最后,按照输出字符串的机制进行这个输出,每次读取8位,对应ASCⅡ码值输出对应的字符,直到读取到的为0 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值