+ -
当前位置:首页 → 问答吧 → 关于字符串结束符

关于字符串结束符

时间:2011-12-18

来源:互联网

大家好,请看以下源码和问题:
C/C++ code

#include<iostream>
using namespace std;

int main()
{
  char str1[]="I love CHINA!",str2[20], *p1, *p2;
  p1=str1;
  p2=str2;

//问题1.以下用"*p1 != '\0'"判断,循环到了str1的空格,例如I之后的空格为什么条件仍然成立?'\0'不是空格吗?
//如果'\0'不是空格,也就不是ASII表中的0,那么在ASII表中会是哪个值呢?
  for(; *p1 != '\0'; p1++, p2++) 
    *p2=*p1;

//问题2,为什么需要以下这句话,手动填充字符串结尾标志呢?“char str1[]="I love CHINA!"”str1这样声明变量却不
//用呢?
  *p2='\0';
  p1=str1;
  p2=str2;

  cout<<"str1:"<<p1<<endl;
  cout<<"str2:"<<p2<<endl;
  return 0;
}
~




  请大家分别指点以上两个问题。谢谢!

作者: chennut0802   发布时间: 2011-12-18

'\0' 不是空格,是空字符,其ASCII码值为0。空格的ASCII码值是32

作者: mougaidong   发布时间: 2011-12-18

字符串字面值,指的是一个双引号包围的变量,在C/C++中称为C风格字符串,编译器会在它的后面自动添加一个空字符。

说明:空字符就是什么都没有,但是占据一个字节的空间,用来标识字符串的结束。

作者: mougaidong   发布时间: 2011-12-18

不是很懂!不好意思,帮不了忙。

作者: slaf552985592   发布时间: 2011-12-18

1.'\0'不是空格,就是ASII表中的0,空格的ascii值为32(0x20)
2.你的循环到'\0'就结束了,'\0'没有被拷贝,所以要手工加'\0'
  而char str1[]="I love CHINA!",编译器会自动加'\0'的

 

作者: keiy   发布时间: 2011-12-18

4楼正解。。。。。

单步调试可以发现你的循环在'\0'时,没有拷贝给p2;

作者: mingliang1212   发布时间: 2011-12-18

谢谢各位!请问为什么“char str1[]="I love CHINA!",编译器会自动加'\0'的”,而编译器却没有为str2 自动加'\0'呢?当中有什么规则呢?谢谢。

作者: chennut0802   发布时间: 2011-12-18

1.'\0'不是空格
2.你这是对字符操作,\0也是个字符,加这句是告诉输出流遇到\0就结束输出,不然会输出乱码

作者: qscool1987   发布时间: 2011-12-18

你的char str2[20]没有赋值.编译器不可能自动加'\0'的
 char str1[]="I love CHINA!",是因为"I love CHINA!"是常量字串,编译器会在它后面自动加'\0';然后copy到str1

作者: keiy   发布时间: 2011-12-18

引用 6 楼 chennut0802 的回复:
谢谢各位!请问为什么“char str1[]="I love CHINA!",编译器会自动加'\0'的”,而编译器却没有为str2 自动加'\0'呢?当中有什么规则呢?谢谢。

'\0'不是在str1中,而是在"I love CHINA!"中。str1后面的'\0'只是被I love CHINA!"中的'\0'赋值过去的。

字符串常量以'\0'结束这是规定的、

作者: mingliang1212   发布时间: 2011-12-18

如果想学C++,有何必拘泥于\0呢,C++中的string不是很好用么?

作者: proorck6   发布时间: 2011-12-18