C++字符串(C类型)

来源:互联网 发布:上海少儿编程培训班 编辑:程序博客网 时间:2024/05/18 06:22
     

    近几天,感觉没什么事作,又重新看了 C++ Programming Language (以前也没怎么认真看)这本 C++ 经典教程。但在第一部份就遇到了许多问题,以前根本就不太清楚。特别是 char 型指针的运用,不清它与 char 型数组,string 型数据的关系与区别。

       通过几天的学习,感觉已理解了部份,分析了写几种数据类,下面将具体说一说,希望大家提出建议。指出错误!

一.            假如现要存储数据 “abc”

分为两种方式:有带0结束标志的,无带0结束标志的。

1.      有结束标志的定义方法。

Char* ch = “abc”;     // strlen(ch) = 3;   size = 4;(结束标志)

Char  ch[] = “abc”;   // strlen(ch) = 3;   sizeof(ch) /sizeof(char) = 4;

其它还可以以显示的方法加0结束标志。

这两种方式相似,均以0标志字符串结束。所以它们都能用C里的一系列字符串处理函数,如:strcmp(); strcpy()[注意:传递的第一个参数不能是第一种数据类型]; strlen() 等。但它们的实际类型有很大区别。第一种的实际类型为 const char* ,所以不能用下标操作修改某个元素的值,这就说明了strcpy()的运用,但可以整体修改(ch = “aaaa”),因为指针不是常量,它只是一个指向常量的指针(此问题见const 运用)。而第二种是一个字符数组[注意与 char ch[] = { ‘a’, ‘b’, ‘c’ } 的区别]

2.      无结束标志的定义方法。

Char ch[] = { ‘a’, ‘b’, ‘c’ };    //sizeof(ch)/sizeof(char) = 3; 

//strlen(ch) = ? 错误方法,无0结束符。除非为:char ch[] = {‘a’,’b’,’c’,0}

Char* ch = new char[3];  ch[0] = ‘a’; ch[1] = ‘b’; ch[2] = ‘c’;  //strlen(ch) = ?  // size = 3;

String ch = “abc”;   // C++ 提供的 string 类。  //ch.size() = 3; 

在这几种方法中,C里的一系列字符串处理函数就没用了,因为它们要以有0结束符为前提条件。但在使用时可以人为的增加结束符,数组空间增加一个,并在最后一个值改为0来达到结束的条件,但这样用很不是方便。String 类型可以调用相应的函数转化为C类型的字符串(ch.c_str())String 类提供的一系列成员方法明显比 C 类型字符串处理更好,且不易出错。

3.      运用以上的方法可以分析一下面这个定义具体细节。

Char* ch[] = { ‘b’, ‘c’, ‘d’ };

Char* ch[] = { “bbb”, “aaa”, “ccc” };

(1).是否在确。

(2).sizeof(ch); sizeof(ch[1]); strlen(ch); strlen(ch[1]);

(3).ch[1] = “fff”; ch[1][0] = ‘f’; 是否可行。

(4).假如要复制此内容到另一个存储空间,怎样完成。

 

解:(1). 第一个错误,第二个正确。因为第一个是一个数组,且成员为指向字符串的指针,而初始化的数据为字符,可以改为:char* ch[] = { “b”, “c”, “d” }; 下面的题以第二个正确的为前提。

(2).sizeof(ch) = 12;   sizeof(ch)/sizeof(char*) = 3;

  sizeof(ch[1]) = 4;  //指针的长度

  strlen(ch) = ?;     //数组无0结束标志。可以多加一个:char* ch[] = {“bbb”, “aaa”,”ccc”,0};

  strlen(ch[1]) = 3;   //单个数据为 char* ,0结束符,可以计算。

(3).ch[1] = “fff”;     正确,因为它不是常量指针,只是指向常量的指针。

  ch[1][0] = ‘f’;     错误,修改常量。

(4). int size = sizeof(ch)/sizeof(char*);

           char** chh = new char*[size];

           for(int i = 0; i < size; ++i)

           {

              char* c = new char[strlen(ch[i]) + 1];

              strcpy(c, ch[i]);

              chh[i] = c;

    }