C语言字符串问题请教C++ primer中说道:引用C语言中的字符串需要以\0作为结束,比如strlen(p),传入的参数的
C语言字符串问题请教
C++ primer中说道:
但是,随后的一个习题代码是这样的:
#include <cstring>
#include <iostream>
using namespace std;
int main(){
const char ca[] = { 'h','e','l','l','o' };
const char *cp = ca;
while( *cp ){
cout << *cp << endl;
cp ++;
}
return 0;
}
经过我的编译执行,按书上所说的,字符串ca没有以\0结束,那么while循环应该在打印完hello后,会在打印一些未定义的字符,直到遇到\0再跳出循环,为什么我在机器上没有实现这种情况?还是说我的理解有误?
机器环境:
G++ 4.6.1 ubuntu-i686
请教大家,不甚感激 C++ C 字符串 标准库 字符函数
[解决办法]多试几种情况,多试几次
另外,仅供参考。
[解决办法]试一下其他情况,看看是不是也一样
[解决办法]你已找到错误了。要打印的字符是不可预测的
[解决办法]lz,多试几种情况吧,像这种未定义的行为,其运行结果也是不确定的,建议LZ这样复制,确保字符数组有'\0'结束符:const char ca[] = "hello,world".
[解决办法]你怎么知道刚好打印完hello 后面的刚好不是结束符'\0'呢?
所以后面的结果是不可知道的!不同的编译器下面,可能结果就不一样了!
[解决办法]你的理解没有错是,是运行环境错了。
你可以跟踪进去到const char ca[] = { 'h','e','l','l','o' }; 之后语句,然后看看ca[5]值是什么?原理上讲,按你的代码,那应该是个随机数
[解决办法]
#include <cstring>
#include <iostream>
using namespace std;
int main(){
const char ca[] = { 'h','e','l','l','o' };
const char *cp = ca;
int i =0 ;
while( *cp ){
cout<<i<<"、" << *cp << endl;
i++;
cp ++;
}
cout<<"打印结束"<<endl;
return 0;
}
学会打印,来发现问题,这是程序调试的基本手段
const char ca[] = { 'h','e','l','l','o' };
打印的时候,会一直找到,'hello'后面的内存,为'\0'字节的时候,程序跳出循环
用这种方法初始化,末尾会自动加'\0',实际开发中多用下面这种
const char ca[] = "hello,world".