关于'\0'的问题,求大神大神大神!!!!!

qt228186471 2012-10-11 09:01:13
求大神帮您忙啊 啊啊啊啊!


'\0'表示的不是结束符的意思么,
如果是结束符,
我想问的问题是:
为什么输出的a[2]的值运行的时候显示的是空格呢,
空格跟结束符不是不一样么,
那这样一来,结束符跟空格运行的效果不是一样了么?
求指导!!!!
#include<stdio.h>
void main()
{
char a[5]={'a','b','\0','c','d'};
int i;
for(i=0;i<5;i++)
printf("%c",a[i]);
printf("\n%s\n",a);
}
...全文
304 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
滴答滴答D 2012-10-14
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 的回复:]

刚才在VC下看了下寄存器的内容.当执行到打印 '\0' 的时候, ECX 的内容为 0,即编译器没有将 '\0' 优化为空格呀,难道是 printf 函数内部做了处理?
[/Quote]
这个印证了我上面的说话么?
VC下的 printf 不是标C中的printf么?不然为什么在 linux 下调用,不会出现空格呢?
滴答滴答D 2012-10-14
  • 打赏
  • 举报
回复
刚才在VC下看了下寄存器的内容.当执行到打印 '\0' 的时候, ECX 的内容为 0,即编译器没有将 '\0' 优化为空格呀,难道是 printf 函数内部做了处理?
wangqiang1101 2012-10-14
  • 打赏
  • 举报
回复
'\0'的编码是0 而‘ ’空格的编码是32 这跟本就是两个字符 ASCII码打印出来的
AndyZhang 2012-10-14
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]

print each character.
abcd
print string.
ab

我这样理解的,不知对不对:
\0 是一个不可见字符.其实printf还是执行了打印操作的,只不过这个打印的结果我们看不见
而对于字符串,当printf遇到这个字符时,就结束打印,即没有执行打印 '\0'

如果理解不对,期待指正!!!
[/Quote]
对的,其实可以这么理解。没问题
滴答滴答D 2012-10-14
  • 打赏
  • 举报
回复
print each character.
abcd
print string.
ab

我这样理解的,不知对不对:
\0 是一个不可见字符.其实printf还是执行了打印操作的,只不过这个打印的结果我们看不见
而对于字符串,当printf遇到这个字符时,就结束打印,即没有执行打印 '\0'

如果理解不对,期待指正!!!
bookc-man 2012-10-14
  • 打赏
  • 举报
回复
你第一个是输出‘\0’,‘\0‘代表就是空
至于第二个,你应该懂的,’\0‘是字符串结束符号
myliupp 2012-10-14
  • 打赏
  • 举报
回复
  我用VC6显示空格。对于这些不可显示的字符,具体实现可以采用各自的策略。如果完全什么都不显示,怎么知道有过字符呢,因此每种实现都按自己的理解设计,有时还是操作系统的问题,比如这个显示工作交给OS的函数去做,结果有赖于系统。像在SQL中,NULL值的显示,是可以设置的,有的啥也不显示,有的显示.,有的显示-,还有NULL,<NULL>等等。UltraEdit的HEX模式中,不可显示字符由于占位的原因,你必须要用空格来显示,要不然后边的字符就跑到前边来了,在另一侧的16进制显示则可帮你对应。没什么好纠结的。
赵4老师 2012-10-12
  • 打赏
  • 举报
回复
VC调试时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)

这辈子不看内存地址和内存值;只画链表、指针示意图,画堆栈示意图,画各种示意图,甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗?本人深表怀疑!
这辈子不种麦不收麦不将麦粒拿去磨面;只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头,压面条,烤面包,……能从本质上理解面粉、理解面食吗?本人深表怀疑!!

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

有人说一套做一套,你相信他说的还是相信他做的?
其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗?

不要写连自己也预测不了结果的代码!

电脑内存只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是很多数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、……
newtee 2012-10-12
  • 打赏
  • 举报
回复
这辈子不看内存地址和内存值;只画链表、指针示意图,画堆栈示意图,画各种示意图,甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗?本人深表怀疑
对指针糊里糊涂 o(︶︿︶)o
kemengli 2012-10-12
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

VC调试时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Turbo C或Borland C用Turbo Debugger调试,Lin……
[/Quote]

佩服
cheung189 2012-10-11
  • 打赏
  • 举报
回复
我用vc++2010 也有空格~呵呵
也在爬文中,莫名其妙~在字符里卻是打出直格,但用來%D看看..那值還是ASCII的0...
夏天__ 2012-10-11
  • 打赏
  • 举报
回复
'\0'不是一个可打印字符,所以它怎么显示都是无效的,

楼主用的什么编译器显示的空格?

gcc下面没有输出显示



[root@bogon temp]# cat t3.c
#include<stdio.h>
void main()
{
char a[5]={'a','b','\0','c','d'};
int i;
for(i=0;i<5;i++)
printf("%c",a[i]);
printf("\n%s\n",a);
}
[root@bogon temp]# gcc -g -o t3 t3.c
[root@bogon temp]# ./t3
abcd
ab
[root@bogon temp]#
zhaoming262350 2012-10-11
  • 打赏
  • 举报
回复
‘\0’ 不仅仅是一个字符串的结束符,可以占一个字节的存储位置,
‘\0’ 代表ASCII 码为0的字符,从ASCII码表中可以查到,ASCII码为0 的字符不是一个可以显示的字符,而是一个“空操作符”,也就是什么也不做。用它来作为字符串结束标志不会产生附加的操作或增加的操作,只起到一个供辨别的标志。
  • 打赏
  • 举报
回复
空格不等于\0
lin5161678 2012-10-11
  • 打赏
  • 举报
回复
输出 '\0' 结果是不确定的 不过 是属于实现定义还是 未明确 还是未定义我就不清楚了
mujiok2003 2012-10-11
  • 打赏
  • 举报
回复
标准ASCII表,0x20~0x7e是可打印的字符。
newtee 2012-10-11
  • 打赏
  • 举报
回复
'\0'是ASCII码中的第一个符号 即(null)
'\0' 是字符串的结束符
zhcosin 2012-10-11
  • 打赏
  • 举报
回复
'\0'不是一个可打印字符,所以它怎么显示都是无效的,掌握了这点就不用纠结了。

69,374

社区成员

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

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