关于C语言puts输出字符串的问题

爱吃瓜的猹z 2018-07-22 10:26:45
具体的请看图片上编译的结果
...全文
885 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
_肆 2018-07-27
  • 打赏
  • 举报
回复
首先puts和strlen都是找\0

在有的编译器里,char[]这个东西是根据后面{}里面的内容分配大小的,所以你这三个走下来都是对的,比如我用dev c++编译是对的。

但是有的编译器里,比如vs,会把内存里所有的地址的值都默认为0xcc,但是其他程序可能会使用了某些地址,已经写了一些值,这时你的前两种情况后面的东西是自带\0的,所以前两个char[]在内存上分配到了13,用puts或strlen找到第13位的\0返回12,然后你第三种自己是不带\0的,就是在内存上分配到了12,用puts或strlen的时候会在内存地址上一直往后找\0,所以根据不同的电脑来编译,输出的长度和字符内容都不一样,会有一些乱码。

而你现在的这个就很巧合,内存分配是随机的,但还是有规律,比如就近选取,你的正好就是c的12个后面跟了a或b的13个,所以打下来就是两个hello world!和24,而我自己试验打下来是hello world!烫烫烫烫hello world!,32长度,用十六进制展开就是'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!',0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!','\0',中文烫的十六进制就是0xcccc

至于当你写成char[100]时,就是abc各申请了连续的100内存,这时候除过三者的12个字符数据不会连在一起,对有限定长度的数组,赋值时,不满100的其他位,vs会直接赋值\0,这些加断点都是可以看到的
爱吃瓜的猹z 2018-07-27
  • 打赏
  • 举报
回复
引用 9 楼 weixin_42559124 的回复:
一个个字符输入字符数组后,系统不会在后面自动加\0,而strlen函数的结束条件是遇到\0自动结束,所以strlen不正确,我按照你的代码试了一下但是输出结果和你的不同输出结果如下:hello world!€
15Press any key to continue,可能答得不好请多多见谅 。

怎么会是15个字符,长度明明是12个呀!
爱吃瓜的猹z 2018-07-27
  • 打赏
  • 举报
回复
引用 7 楼 goldenhawking 的回复:
程序有问题。没有 \0 结束很危险。
你这是Debug还是Release?如果碰巧数组后面没有0填充,就有意外了。
正确的:
const char * c = "hello world";
char c[] = {'a','b','c',0};

您看,我定义的char c[]={"..."}和定义的char c[100]={"..."}得到的结果是不一样的
吃着油条唱歌 2018-07-26
  • 打赏
  • 举报
回复
一个个字符输入字符数组后,系统不会在后面自动加\0,而strlen函数的结束条件是遇到\0自动结束,所以strlen不正确,我按照你的代码试了一下但是输出结果和你的不同输出结果如下:hello world!€
15Press any key to continue,可能答得不好请多多见谅 。
爱吃瓜的猹z 2018-07-26
  • 打赏
  • 举报
回复
引用 5 楼 zhao_miao 的回复:
puts打印字符串,遇到‘\0’会停止,因为你的char c[]没有'\0',所有它打印出hello,world之后会打印随机值。
strlen也是遇到‘\0’停止,char c[]没有'\0'所有打印出来的也是随机值
也不随机啊,因为试了好几次都是输出了两遍得hello world!
zhao_miao 2018-07-23
  • 打赏
  • 举报
回复
puts打印字符串,遇到‘\0’会停止,因为你的char c[]没有'\0',所有它打印出hello,world之后会打印随机值。
strlen也是遇到‘\0’停止,char c[]没有'\0'所有打印出来的也是随机值
  • 打赏
  • 举报
回复
程序有问题。没有 \0 结束很危险。
你这是Debug还是Release?如果碰巧数组后面没有0填充,就有意外了。
正确的:
const char * c = "hello world";
char c[] = {'a','b','c',0};
自信男孩 2018-07-23
  • 打赏
  • 举报
回复
第一个不是字符串,而是字符数组。因为没有'\0'。
第二个也是字符数组,但是指定了字符数组的长度100,实际字符长度是12个,后面的88个字符是用'\0'填充。因此可以认为是字符串。
爱吃瓜的猹z 2018-07-22
  • 打赏
  • 举报
回复
就在红框里面,我列出的是三种字符串的表达形式,第三种如果没有规定字符串数组的长度的话,用puts()函数的话输出额是两遍“hello world!”而且看出字符串的长度是上两种表达形式的二倍,但是我给字符串数组规定长度的话(长度为大于12的任意值),三种表达方式输出的结果都一样了,我想知道这是为什么。
很抱歉,这是我第一次问问题,还是菜鸡的说
vnvlyp 2018-07-22
  • 打赏
  • 举报
回复
什么问题也不说,还要别人猜吗?
赵4老师 2018-07-22
  • 打赏
  • 举报
回复
...,'!',0};
赵4老师 2018-07-22
  • 打赏
  • 举报
回复
http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧