c字符串、string对象、字符串字面值的区别
一、字符串字面值
字符串字面值是一串常量字符,字符串字面值常量用双引号括起来的零个或多个字符表示,为兼容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对象、字符串字面值的区别相关推荐
- 冒泡排序和字符串(String)对象及处理字符串的方法
冒泡排序 第一种方法var times=0;var arr=[12,3,6,9,77,37];for(var i=0;i<arr.length-1;i++){ //控制比较的行数for (var ...
- js javascript 判断字符串是否包含某字符串,String对象中查找子字符,indexOf
var Cts = "bblText";if(Cts.indexOf("Text") >= 0 ) {alert('Cts中包含Text字符串'); } ...
- python中dict对象和字符串string对象互相转换
使用json包 import json dict1 = {"A":"a","B":"b"} # 转换为字符串 json. ...
- C++ Tricks(一)—— 判断字符串 string 对象的所有字符都相等
S == string(S.size(), S[0]);
- 内置对象的API Array数组对象 String字符串对象 json字符串 JSON对象 js作用域及变量预解析 引用类型与值类型区别 共享引用 基本包装类型 数组去重
01-内置对象的API a.Date对象获取时间 b.Array对象数组加工 c.String对象字符串加工 d.json字符串的语法格式 e.JSON对象的字符串与对象转换应用 02-JS作用域 a ...
- 【C++ 语言】C++字符串 ( string 类 | 创建方法 | 控制台输出 | 字符串操作 | 栈内存字符串对象 | string* )
文章目录 C++ 字符串 对象 C++ 字符串 对象 创建方法 C++ 字符串 对象 输出到控制台 C++ 字符串 拼接 C++ 字符串 方法调用 ( 栈内存对象 ) C++ 字符串 方法调用 ( 堆 ...
- html5 字符串对象,JavaScript核心对象-String对象
字符串是JavaScript中最常使用的一个对象,几乎每一个程序都会使用到字符串.与其它基本数据类型一样,字符串也有两种形式:基本数据类型形式和对象形式.JavaScript会根据需要在这两种形式之间 ...
- java equals equalsignorecase 性能_JAVA中字符串比较equals()和equalsIgnoreCase()的区别
JAVA中字符串比较equals()和equalsIgnoreCase()的区别 1.使用equals( )方法比较两个字符串是否相等.它具有如下的一般形式: boolean equals(Objec ...
- java中String xx xx_JAVA超级基础之String型字符串
字符串 String类型(字符串类型==数据(char[])+操作(char[]中定义的方法)) 功能:字符串常量是系统能够显示的任何文字信息,必须包含在双引号("")之内. 1. ...
- Redis学习---(7)Redis 字符串(String)
Redis 字符串(String) Redis 字符串数据类型的相关命令用于管理 redis 字符串值,基本语法如下: 语法 redis 127.0.0.1:6379> COMMAND KEY_ ...
最新文章
- 吴恩达机器学习笔记 —— 5 多变量线性回归
- 会计转行算法之路(一)会计转程序员
- 大于等于符号_英语标点符号怎么读,这下全知道了!
- 尚硅谷李老师笔记3DQL
- Java 解析URL
- 通过腾讯地图、高德地图、百度地图开发接口获取坐标对应的周边相关信息
- mkdir 创建多级目录_Linux mkdir命令:创建目录(文件夹)
- centos是什么系统_解决更换操作系统后的开机问题
- 实现键盘输入信息,按enter键调用摄像头自动拍照
- 免费下载思科 642-382考试题库
- MySQL之环境变量配置
- windows10下破解开机密码
- VS2015 社区版下载
- java与javaw运行jar程序
- 【matlab】Simulink 微分模块的线性化问题
- 双向可控硅晶片光耦(TLP160J TLP260J TLP525G)基本原理及应用实例
- 收费java代码_基于jsp的高速公路收费-JavaEE实现高速公路收费 - java项目源码
- ad被锁定的账户_【原创】解决AD账户被莫名其妙的锁定问题
- 显卡知识扫盲 为你讲述流水线的发展与未来
- Google AIY 套件将亮相香港!人工智能新一轮风潮袭来!