C++字符串(C类型)

原创 2006年06月05日 11:17:00
     

    近几天,感觉没什么事作,又重新看了 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;

    }

c/c++各种字符、字符串类型转换

itoa   功 能:把一整数转换为字符串   用 法:char *itoa(int value, char *string, int radix);   详细解释:itoa是英...

c/c++各种字符、字符串类型转换

CString 是一种很特殊的 C++ 对象,它里面包含了三个值:一个指向某个数据缓冲区的指针、一个是该缓冲中有效的字符记数(它是不可存取的,是位于 CString 地址之下的一个隐藏区域)以及一个缓...

C/C++ —— 十六进制类型字符串的转换

在实际工作中,字符串和其它数据类型的转换是很常见的,库函数有很多,比如 atoi , strtol , sscanf 等,这些函数网上有很多资料, 我经常用到的就是十六进制的数值以字符串的形式传输,...
  • jscese
  • jscese
  • 2014年09月04日 18:57
  • 3956

C++ string类型与 C 风格字符串性能比较

最近在拜读《C++ Primer》,C++ 标准库里的string 类型的确比 C 风格的字符串好用(代码简洁、安全、易读),但是心里总担心其包装好了性能可能会损失,于是就做了下面这个小测试,来比较一...

C风格类型的字符串在C++中的应用

/*  *字符串常量(即字符串字面量)的一些问题  *处理字符串的一些函数  */ #include using namespace std; #include int ma...

C\C++ 程序员从零开始学习Android - 个人学习笔记(四) - java基础 - 数据类型、变量、字符串、数组

1,数据类型   java数据类型分为基本类型(原始类型、原生类型)和引用类型两种。 1.1 基本类型   包括布尔类型、数值类型、returnAddress类型。 1...

C++中的数组array和vector,lambda表达式,C字符串加操作,C++中新类型数组(数组缓存),多元数组,new缓冲

 使用C++风格的数组,不需要管理内存。 array要注意不要溢出,因为它是栈上开辟内存. array适用于任何类型 #include #in...

C/C++关于字符串string、char*字符串数组与其他类型转换

C/C++关于字符串string、char*字符串数组与其他类型转换

C++中的字符串类型

  • 2014年09月01日 13:57
  • 70KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++字符串(C类型)
举报原因:
原因补充:

(最多只允许输入30个字)