一、字符串字面值

字符串字面值是一串常量字符,字符串字面值常量用双引号括起来的零个或多个字符表示,为兼容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 \nstring literal\nusing a backslash"<< std::endl;

输出:a multi-line string literalusing a backslash

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

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

cout<<"hello"<<endl;

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

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

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

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

const char* ptr = "hello";ptr[1] = 'a';//bug! attempts to write to read-only memory.

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

char stackArray[] = "hello";stackArray[1] = 'a';

二、C++风格字符串

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

1. 支持<cstring>中许多函数完成的同样操作。
2. 字符串定义:

string myString = “hello”;

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

string newone = original;

会将后者复制给前者,不会出现两个变量同样指向一个内存的情况。
4. 可以像int一样使用 == 之类的操作符
5. 可以改变字符串中的某一个字符。 如

string myString = "hello"; mystring[0] = 'l'; 

这中操作是允许的。

2.1 C风格字符串的使用

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

const char *cp = "some value"; // 一个C风格字符串while(*cp) //判断cp当前指向的字符是true还是false,true表明这是除null外的任意字符{ // do something to *cp ++cp;}

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

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

//操纵C风格字符串的标准库函数(参数类型省略,都是char *类型):strlen(s) // 返回s的长度,不包括字符串结束符nullstrcmp(s1, s2) //当s1<s2时,返回值<0 ,当s1=s2时,返回值=0 ,当s1>s2时,返回值>0 strcat(s1, s2) // 将字符串s2连接到s1后,并返回s1 strcpy(s1, s2) // 将s2复制给s1,并返回s1strncat(s1, s2, n) // 将s2的前n个字符连接到s1后面,并返回s1strncpy(s1, s2, n) // 将s2的前n个字符复制给s1,并返回s1if(cp1 < cp2) // compares address, not the values pointed toconst char *cp1 = "A string example";const char *cp2 = "A different string";int i=strcmp(cp1, cp2); // i is positivei=strcmp(cp2, cp1); // i is negativei=strcmp(cp1, cp1); // i is zero

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

char ca[]={'C', '+', '+'}; // not null-terminatedcout << strlen(ca) << endl; // disaster: ca isn't null-terminated

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

// Dangerous:What happens if we miscalculate the size of largeStr?char largeStr[16+18+2]; // will hold cp1 a space and cp2strcpy(largeStr, cp1); // copies cp1 into largeStrstrcat(largeStr, " "); // adds a space at end of largeStrstrcat(largeStr, cp2); // concatenates cp2 to largeStr// prints A string example A different stringcout << largeStr << endl;

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

char largeStr[16+18+2] // to hold cp1 a space and cp2strncpy(largeStr, cp1, 17); // size to copy includes the nullstrncat(largeStr, " ", 2); // pedantic, but a good habitstrncat(largeStr, cp2, 19); // adds at most 18 characters, plus a null

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

string largeStr = cp1; // initialize largeStr as a copy of cp1largeStr += " "; // add space at end of largeStrlargeStr += cp2; // concatenate cp2 onto end of largeStr

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

三、C风格字符串

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

char ca1[]={'C', '+', '+'}; // no null, not C-style stringchar ca2[]={'C', '+', '+', '\0'}; // explicit nullchar ca3[]="C++"; // null terminator added automaticallyconst char *cp="C++"; // null terminator added automaticallychar *cp1=ca1; // points to first element of a array, but not C-style stringchar *cp2=ca2; // points to first element of a null-terminated char array

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

字符串的连接:

1.c++中string可以替代c中的char数组且前者用起来更方便。连接两个string对象只需用'+';c字符串是用char数组实现的。以下都称c字符串为char数组

例如:string s1="hello",s2="world";

string s3=s1+s2;                  //也可以s3=s1+"world"

cout<<s3<<endl;//结果为helloworld

当然还可以用+=连接。

2.还可以这样连接一个string对象和char数组。

例如:string s1="hello";

char s2[]="world";

cout<<s1+s2<<endl;//输出结果为helloworld

但不能这样连接两个char数组或字符字面值。

例如:string s1="hello";

string s2="world";

string s3=s1+"world";//正确,可以连接一个string对象和字符串字面值

string s4="hello"+"world";//错误,不能这样连接连个字符串字面值

char s5[]="world";

string s6=s1+s5;//正确,可以连接一个string对象和char数组

char s7[]="hello";

stirng s8=s7+s5;//错误,不能这样连接两个char数组。

总而言之只能用+或+=连接两个string对象或一个string对象和字符串字面值或一个string对象和char数组。

连接一个string对象和字符串字面值或char数组或返回的都是string对象,所以可以连接一个string对象和字符串字面值(或char数组)后再连接一个字符串字面值(或char数组)。

例如:string s;//初始化为空
    char s1[]="hello";
    char s2[]="world";
    s=s+s1+s2;//正确

转载自:http://blog.csdn.net/sky_clara/article/details/7889410

c字符串、string对象、字符串字面值的区别相关推荐

  1. 冒泡排序和字符串(String)对象及处理字符串的方法

    冒泡排序 第一种方法var times=0;var arr=[12,3,6,9,77,37];for(var i=0;i<arr.length-1;i++){ //控制比较的行数for (var ...

  2. js javascript 判断字符串是否包含某字符串,String对象中查找子字符,indexOf

    var Cts = "bblText";if(Cts.indexOf("Text") >= 0 ) {alert('Cts中包含Text字符串'); } ...

  3. python中dict对象和字符串string对象互相转换

    使用json包 import json dict1 = {"A":"a","B":"b"} # 转换为字符串 json. ...

  4. C++ Tricks(一)—— 判断字符串 string 对象的所有字符都相等

    S == string(S.size(), S[0]);

  5. 内置对象的API Array数组对象 String字符串对象 json字符串 JSON对象 js作用域及变量预解析 引用类型与值类型区别 共享引用 基本包装类型 数组去重

    01-内置对象的API a.Date对象获取时间 b.Array对象数组加工 c.String对象字符串加工 d.json字符串的语法格式 e.JSON对象的字符串与对象转换应用 02-JS作用域 a ...

  6. 【C++ 语言】C++字符串 ( string 类 | 创建方法 | 控制台输出 | 字符串操作 | 栈内存字符串对象 | string* )

    文章目录 C++ 字符串 对象 C++ 字符串 对象 创建方法 C++ 字符串 对象 输出到控制台 C++ 字符串 拼接 C++ 字符串 方法调用 ( 栈内存对象 ) C++ 字符串 方法调用 ( 堆 ...

  7. html5 字符串对象,JavaScript核心对象-String对象

    字符串是JavaScript中最常使用的一个对象,几乎每一个程序都会使用到字符串.与其它基本数据类型一样,字符串也有两种形式:基本数据类型形式和对象形式.JavaScript会根据需要在这两种形式之间 ...

  8. java equals equalsignorecase 性能_JAVA中字符串比较equals()和equalsIgnoreCase()的区别

    JAVA中字符串比较equals()和equalsIgnoreCase()的区别 1.使用equals( )方法比较两个字符串是否相等.它具有如下的一般形式: boolean equals(Objec ...

  9. java中String xx xx_JAVA超级基础之String型字符串

    字符串 String类型(字符串类型==数据(char[])+操作(char[]中定义的方法)) 功能:字符串常量是系统能够显示的任何文字信息,必须包含在双引号("")之内. 1. ...

  10. Redis学习---(7)Redis 字符串(String)

    Redis 字符串(String) Redis 字符串数据类型的相关命令用于管理 redis 字符串值,基本语法如下: 语法 redis 127.0.0.1:6379> COMMAND KEY_ ...

最新文章

  1. 吴恩达机器学习笔记 —— 5 多变量线性回归
  2. 会计转行算法之路(一)会计转程序员
  3. 大于等于符号_英语标点符号怎么读,这下全知道了!
  4. 尚硅谷李老师笔记3DQL
  5. Java 解析URL
  6. 通过腾讯地图、高德地图、百度地图开发接口获取坐标对应的周边相关信息
  7. mkdir 创建多级目录_Linux mkdir命令:创建目录(文件夹)
  8. centos是什么系统_解决更换操作系统后的开机问题
  9. 实现键盘输入信息,按enter键调用摄像头自动拍照
  10. 免费下载思科 642-382考试题库
  11. MySQL之环境变量配置
  12. windows10下破解开机密码
  13. VS2015 社区版下载
  14. java与javaw运行jar程序
  15. 【matlab】Simulink 微分模块的线性化问题
  16. 双向可控硅晶片光耦(TLP160J TLP260J TLP525G)基本原理及应用实例
  17. 收费java代码_基于jsp的高速公路收费-JavaEE实现高速公路收费 - java项目源码
  18. ad被锁定的账户_【原创】解决AD账户被莫名其妙的锁定问题
  19. 显卡知识扫盲 为你讲述流水线的发展与未来
  20. Google AIY 套件将亮相香港!人工智能新一轮风潮袭来!

热门文章

  1. 也许你应该学学 postman了
  2. Javascript实现树结构
  3. CODEVS——T 1005 生日礼物
  4. MAC 命令行 查看硬盘和文件夹大小(占用空间)
  5. 使用Composer管理项目第三方库文件
  6. Python 读取 16通道tif并转为jpg png通用格式
  7. XMind思维导图安卓PC直装入门下载及常见问题解决教程
  8. 云桌面和计算机,云桌面和电脑在使用上的差别你都知道吗
  9. 首届掘金挑战者杯股票量化大赛报名开启
  10. 关于COMMIT WORK 和COMMIT WORK AND WAIT的区别及ROLLBACK WORK