首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C语言字符串有关问题请问

2013-11-18 
C语言字符串问题请教C++ primer中说道:引用C语言中的字符串需要以\0作为结束,比如strlen(p),传入的参数的

C语言字符串问题请教
C++ primer中说道:

引用
C语言中的字符串需要以\0作为结束,比如strlen(p),传入的参数的最后一位必须是\0,否则会出现错误。
然后举了个例子:
char ca[] = { 'c','+','+' };
cout << strlen(ca) << endl;  // 这里会出错

但是,随后的一个习题代码是这样的:

#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'呢?
所以后面的结果是不可知道的!不同的编译器下面,可能结果就不一样了!
[解决办法]
引用:
C++ primer中说道:
引用
C语言中的字符串需要以\0作为结束,比如strlen(p),传入的参数的最后一位必须是\0,否则会出现错误。
然后举了个例子:
char ca[] = { 'c','+','+' };
cout << strlen(ca) << endl;  // 这里会出错

但是,随后的一个习题代码是这样的:

#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

请教大家,不甚感激


你的理解没有错是,是运行环境错了。
你可以跟踪进去到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". 

热点排行