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 \n
string literal\n
using 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风格字符串。


代码如下:

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

//操纵C风格字符串的标准库函数(参数类型省略,都是char *类型):
strlen(s) // 返回s的长度,不包括字符串结束符null
strcmp(s1, s2) //当s1<s2时,返回值<0 ,当s1=s2时,返回值=0 ,当s1>s2时,返回值>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
const char *cp1 = "A string example";
const char *cp2 = "A different string";
int i=strcmp(cp1, cp2); // i is positive
i=strcmp(cp2, cp1); // i is negative
i=strcmp(cp1, cp1); // i is zero

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


代码如下:

char ca[]={'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?
char largeStr[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风格字符串


代码如下:

char largeStr[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


代码如下:

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

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

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


代码如下:

char ca1[]={'C', '+', '+'}; // no null, not C-style string
char ca2[]={'C', '+', '+', '\0'}; // explicit null
char ca3[]="C++"; // null terminator added automatically
const char *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结束的数组。

字符串的连接:
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;//正确

(0)

相关推荐

  • C++中访问字符串的三种方法总结

    1.用字符数组存放一个字符串 程序1:定义一个字符数组并初始化,然后输出其中的字符串. 复制代码 代码如下: #include<iostream>using namespace std;int main(){ char str[]="I lvoe China!"; cout<<str<<endl; return 0;} 输出结果: 复制代码 代码如下: I love China! str是字符数组名,它代表数组首元素的地址,输出str的时候,从str

  • 基于C语言字符串函数的一些使用心得

    就字符串的拼接函数为例strcat.原型:extern char *strcat(char *dest,char *src);用法:#include <string.h>功能:把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0'.说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串.      返回指向dest的指针.举例: 复制代码 代码如下: // strcat.c      #include <syslib.h&

  • C++ 字符串的反转五种方法实例

    复制代码 代码如下: //通过不同的方法,实现对所输入字符串的反转,可以很好地复习巩固 C++ 基础知识/*分析过程: 假设要使传递的字符串为常量const字符串,这样操作更加灵活,可直接传递字符串字面值进行反转,常见的解决方法就是,定义一个新的与传递过来字符串长度 相等的字符数组,然后进行字符串拷贝,把str字符按从左到右放置到字符数组中,然后采用循环来对字符数组中字符反转*//*第一种,采用以上思路解法,传递为const类型C风格字符指针,返回为char*类型*///直接使用字符数组赋值ch

  • C字符串与C++中string的区别详解

    在C++中则把字符串封装成了一种数据类型string,可以直接声明变量并进行赋值等字符串操作.以下是C字符串和C++中string的区别:  C字符串 string对象(C++) 所需的头文件名称  <string>或<string.h> <string>或<string.h> 需要头文件 原因 为了使用字符串函数 为了使用string类 声明 方式 char name[20]; string name; 初始化方式 char name[20]="

  • python字符串的index和find的区别详解

    1.find函数 find() 方法检测字符串中是否包含子字符串 str ,如果指定 beg(开始) 和 end(结束) 范围,则检查是否包含在指定范围内,如果指定范围内如果包含指定索引值,返回的是索引值在字符串中的起始位置.如果不包含索引值,返回-1. string='abcde' x=string.find('a') y=string.find('bc') z=string.find('f') print(x) print(y) print(z) #运行结果 0 1 -1 2.index函数

  • 基于js 字符串indexof与search方法的区别(详解)

    1.indexof方法 indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置. 语法: 注意:有可选的参数(即设置开始的检索位置). 2.search方法 search() 方法用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串. 注意:search方法可以根据正则表达式查找指定字符串(可以忽略大小写,并且不执行全局检索),同时没有可选参数(即设置开始的检索位置). 以上这篇基于js 字符串indexof与search方法的区别(详解)就是小编分享给大家的全部

  • python字符串string的内置方法实例详解

    下面给大家分享python 字符串string的内置方法,具体内容详情如下所示: #__author: "Pizer Wang" #__date: 2018/1/28 a = "Let's go" print(a) print("-------------------") a = 'Let\'s go' print(a) print("-------------------") print("hello"

  • c语言获取用户输入字符串是scanf和gets的区别详解

    解释 gets(s)函数与 scanf("%s",&s) 相似,但不完全相同,使用scanf("%s",&s) 函数输入字符串时存在一个问题,就是如果输入了空格会认为字符串结束,空格后的字符将作为下一个输入项处理,但gets()函数将接收输入的整个字符串直到遇到换行为止. 1.scanf() 所在头文件:stdio.h 语法:scanf("格式控制字符串",变量地址列表); 接受字符串时:scanf("%s",

  • java中String StringBuffer和StringBuilder的区别详解

    目录 从声明定义上来谈 从结构上来谈 从线程安全来谈 总结 从声明定义上来谈 只有String 可以 直接声明创建 而 StringBuffer 与 StringBuilder 必须去new对象 这是因为只有String会在这种声明方式下去字符串常量池创建,其他则没有 StringBuffer stf = new StringBuffer("abc"); StringBuilder stb = new StringBuilder("abc"); StringBuff

  • TypeScript数组实现栈与对象实现栈的区别详解

    目录 前言 数组实现栈 实现思路 实现代码 编写测试代码 对象实现栈 实现代码 编写测试代码 二者的区别 十进制转二进制 前言 栈作为一种数据结构,它可以应用在很多地方,当你需要经常获取刚存放进去的数据时,那么栈这种数据结构将是你的首选. 栈的实现方式一般有两种:数组实现和对象实现,这两种实现方式最终实现的功能都是一样的,但是在性能上却有着很大的差别. 本文将详细讲解这两种实现方式的差异并用TypeScript将其实现,欢迎各位感兴趣的开发者阅读本文. 数组实现栈 本文讲解的是栈用代码的实现,如

  • c字符串,string对象,字符串字面值的区别详解

    一.字符串字面值字符串字面值是一串常量字符,字符串字面值常量用双引号括起来的零个或多个字符表示,为兼容C语言,C++中所有的字符串字面值都由编译器自动在末尾添加一个空字符.字符串没有变量名字,自身表示自身 复制代码 代码如下: "Hello World!" //simple string literal"" //empty string literal"\nCC\toptions\tfile.[cC]\n" //string literal us

  • JavaScript原生对象之String对象的属性和方法详解

    length length 属性可返回字符串中的字符数目. length 是根据字符串的UTF-16编码来获取长度的,空字符串长度为0.length 不可修改. charAt() charAt() 方法可返回指定位置的字符.注意,JavaScript 并没有一种有别于字符串类型的字符数据类型,所以返回的字符是长度为 1 的字符串. stringObject.charAt(index) 参数index是必需的.表示字符串中某个位置的数字,即字符在字符串中的下标.字符串中第一个字符的下标是 0.如果

  • C#中string.Empty和null的区别详解

    这是一个及其常见的问题,网上已经有关于这个问题的很多讨论.但是我觉得都是不求甚解,有一些还是在误导别人.下面我来说下我对这三者的理解,如有错误的地方请大家及时指正. 一:""与string.Empty我认为是一样的.网上有一篇被转载了几十遍的文章是这样说的string.Empty 不分配存储空间,"" 分配一个长度为空的存储空间,我认为这句话是错误并且含糊不清的. 1.实际上Empty是string类中的一个静态的只读字段,他的定义是这样的: public stat

  • Perl字符串比较和整数比较的区别详解

    本文向大家介绍一下Perl字符串比较和整数比较. Perl语言中Perl字符串可分为单引号和双引号字符串,那么如何进行Perl字符串比较呢, 请看本文详细介绍: 本文和大家重点讨论一下Perl字符串比较和整数比较, 算术运算符的比较有大于,小于,等于,不等于等关系, 而Perl字符串比较也不例外, 这里向大家详细介绍一下: 一. 字符串比较操作符 操作符 描述 lt 小于 gt 大于 eq 等于 le 小于等于 ge 大于等于 ne 不等于 cmp 比较, 返回1,0,or-1 二. 整数比较操

随机推荐