转载--字符串字面值、C风格字符串、C++风格字符串

一、字符串字面值

字符串字面值是一串常量字符,字符串字面值常量用双引号括起来的零个或多个字符表示,为兼容C语言,C++中所有的字符串字面值都由编译器自动在末尾添加一个空字符。

字符串没有变量名字,自身表示自身

"Hello World!"//simple string literal

""//empty string literal

"\nCC\toptions\tfile.[cC]\n"//string literal using newlines and tabs

字符字面值: 'A' //single quote:character literal

字符串字面值: "A" //double quote:character string literal.包含字母A和空字符的字符串

字符串字面值的连接:

std::out<<"a multi-line"+

"string literal"+

"using concatenation"

<< std::endl;

输出:a multi-line string literal using concatenation

多行字面值:

std::out<<"a multi-line \n

stringliteral\n

usinga backslash"

<< std::endl;

输出:a multi-line string literalusing a backslash

=================================================

1. string literal:字符串直接量:

cout<<"hello"<

代码中通过包含"hello"字符串自身来将其输出,并未包含该字符串的变量。

2. 字符串直接量可以赋值给变量,但是与字符串直接量相关联的内存空间位于只读部分,因此它是常量字符数组。

char* ptr ="hello";

ptr[1] ='a';//crash! attemps to write to read-only memory.

因此,当引用字符串直接量的时候使用指向const的字符数组:

constchar* ptr ="hello";

ptr[1] ='a';//bug! attempts to write to read-only memory.

3. 当将字符串直接量赋值给字符数组的初始值的时候。由于字符数组存放与栈中,不允许引用其他地方的内存,因此编译器会将字符串直接量复制到站的数组内存中。因此,可以进行相应的修改。

charstackArray[] ="hello";

stackArray[1] ='a';

二、C++风格字符串

C++风格字符串:使用C++风格字符串的时候,要将它当做是一个普通的类型,如int,这样反而会避免将string作为一个类来理解所带来的很多问题。

1. 支持中许多函数完成的同样操作。

2. 字符串定义:

stringmyString = “hello”;

3. 操作符 = :复制字符串;比如:

stringnewone = original;

会将后者复制给前者,不会出现两个变量同样指向一个内存的情况。

4. 可以像int一样使用 == 之类的操作符

5. 可以改变字符串中的某一个字符。 如

stringmyString ="hello"; mystring[0] ='l';

这中操作是允许的。

三、C风格字符串

字符串字面值的类型实质是const char类型的数组。C++从C语言继承下来的一种通用结构是C风格字符串,而字符串字面值就是该类型的实例。C风格字符串是以空字符null结束的字符数组:

charca1[]={'C','+','+'};//no null, not C-style string

charca2[]={'C','+','+','\0'};//explicit null

charca3[]="C++";//null terminator added automatically

constchar*cp="C++";//null terminator added automatically

char*cp1=ca1;//points to first element of a array, but not C-style string

char*cp2=ca2;//points to first element of a null-terminated char array

ca1和cp1都不是C风格字符串:ca1是一个不带结束符null的字符数组,而指针cp1指向ca1,因此,它指向的并不是以null结束的数组。

2.1 C风格字符串的使用

C++语言通过(const) char *类型的指针来操纵C风格字符串。

constchar*cp ="some value";//一个C风格字符串

while(*cp)//判断cp当前指向的字符是true还是false,true表明这是除null外的任意字符

{

//do something to *cp

++cp;

}

2.2 C风格字符串的标准库函数

#include //cstring是string.h头文件中的C++版本,而string.h是C语言提供的标准库

//操纵C风格字符串的标准库函数(参数类型省略,都是char *类型):

strlen(s)//返回s的长度,不包括字符串结束符null

strcmp(s1, s2)//当s1s2时,返回值>0

strcat(s1, s2)//将字符串s2连接到s1后,并返回s1

strcpy(s1, s2)//将s2复制给s1,并返回s1

strncat(s1, s2, n)//将s2的前n个字符连接到s1后面,并返回s1

strncpy(s1, s2, n)//将s2的前n个字符复制给s1,并返回s1

if(cp1 < cp2)//compares address, not the values pointed to

constchar*cp1 ="A string example";

constchar*cp2 ="A different string";

inti=strcmp(cp1, cp2);//i is positive

i=strcmp(cp2, cp1);//i is negative

i=strcmp(cp1, cp1);//i is zero

2.3 永远不要忘记字符串结束符null

charca[]={'C','+','+'};//not null-terminated

cout << strlen(ca) << endl;//disaster: ca isn't null-terminated

2.4 调用者必须确保目标字符串具有足够的大小

//Dangerous:What happens if we miscalculate the size of largeStr?

charlargeStr[16+18+2];//will hold cp1 a space and cp2

strcpy(largeStr, cp1);//copies cp1 into largeStr

strcat(largeStr,"");//adds a space at end of largeStr

strcat(largeStr, cp2);//concatenates cp2 to largeStr

//prints A string example A different string

cout << largeStr << endl;

2.5 使用strn函数处理C风格字符串

charlargeStr[16+18+2]//to hold cp1 a space and cp2

strncpy(largeStr, cp1,17);//size to copy includes the null

strncat(largeStr,"",2);//pedantic, but a good habit

strncat(largeStr, cp2,19);//adds at most 18 characters, plus a null

2.6 尽可能使用标准库类型string

stringlargeStr = cp1;//initialize largeStr as a copy of cp1

largeStr +="";//add space at end of largeStr

largeStr += cp2;//concatenate cp2 onto end of largeStr

此时,标准库负责处理所有的内在管理问题。


原文地址:http://www.cnblogs.com/coveted/archive/2011/12/28/2304509.html

你可能感兴趣的:(转载--字符串字面值、C风格字符串、C++风格字符串)