广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >c字符串,string对象,字符串字面值的区别详解
  • 412
分享到

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

string字符串 2022-11-15 22:11:16 412人浏览 独家记忆
摘要

一、字符串字面值字符串字面值是一串常量字符,字符串字面值常量用双引号括起来的零个或多个字符表示,为兼容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
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;//正确

--结束END--

本文标题: c字符串,string对象,字符串字面值的区别详解

本文链接: https://www.lsjlt.com/news/172442.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • c字符串,string对象,字符串字面值的区别详解
    一、字符串字面值字符串字面值是一串常量字符,字符串字面值常量用双引号括起来的零个或多个字符表示,为兼容C语言,C++中所有的字符串字面值都由编译器自动在末尾添加一个空字符。字符串没有...
    99+
    2022-11-15
    string 字符串
  • 浅析string类字符串和C风格字符串之间的区别
    最大的区别就是C风格的字符串是静态的,不可以动态变化,使用极为麻烦。而C++的std::string类型动态管理,非常方便。 C风格字符串和char数组是不一样的,看下面两种定义:c...
    99+
    2022-11-15
    string 类字符串 风格字符串
  • C语言字符串替换:字符,字符串,字符数组详解
    目录案例描述案例分析必备知识1,字符数组(1)字符数组的定义(2)字符数组的初始化2,字符串概念(1)字符串的概念(2)用字符初始化字符数组(3)获取字符串的长度3,字符串与指针4,...
    99+
    2022-11-12
  • C语言字符串替换:字符,字符串,字符数组详解
    在C语言中,字符串是由字符数组表示的。一个字符串是一个以null字符('\0')结尾的字符数组。字符替换:要替换字符串中的某个字符,...
    99+
    2023-08-15
    C语言
  • C# String字符串案例详解
    string是一种很特殊的数据类型,它既是基元类型又是引用类型,在编译以及运行时,.Net都对它做了一些优化工作,正式这些优化工作有时会迷惑编程人员,使string看起来难以琢磨。这...
    99+
    2022-11-12
  • Redis 字符串实现:简单动态字符串-SDS与C字符串的区别
    2.1 SDS的定义 struct { //buf中已使用的字节数,等于SDS所保存字符串的长度 int len; //buf中未使用的字节长度 int free; //字节数组,用于保存...
    99+
    2020-09-07
    Redis 字符串实现:简单动态字符串-SDS与C字符串的区别
  • Java的String(字符串详解)
    字符串 1.字符串的常见构造方法 主要有三种,一种是直接使用常量去构造,要么使用new String来构造,或者还可以使用字符数组的形式。 public static void main(String...
    99+
    2023-10-19
    java String 字符串 详解
  • C#字符串之间的区别
    这篇文章主要介绍“C#字符串之间的区别”,在日常操作中,相信很多人在C#字符串之间的区别问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#字符串之间的区别”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!目录...
    99+
    2023-06-20
  • c语言中字符串与字符串数组详解
    目录字符串字符串输出输入字符串字符串常用方法字符串数组总结字符串 用双引号引起来的就是字符串,字符串由字符组成 字符串使用%s格式化输出 字符串以\0结尾,...
    99+
    2022-11-12
  • 详解Python字符串对象的实现
    PyStringObject 结构体 Python 中的字符串对象在内部对应一个名叫 PyStringObject 的结构体。“ob_shash” 对应字符串经计算过的 hash值, “ob_sval” 指...
    99+
    2022-06-04
    字符串 详解 对象
  • C# String字符串的用法
    本篇内容主要讲解“C# String字符串的用法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C# String字符串的用法”吧!string是一种很特殊的数据类型,它既是基元类型又是引用类型,...
    99+
    2023-06-20
  • C#字符串String及字符Char的相关方法
    一、字符串: 1、访问String中的字符: string本身可看作一个Char数组。 string s = "hello world"; for (int i = 0; i &l...
    99+
    2022-11-13
  • C/C++字符函数和字符串函数详解————长度受限制的字符串函数
    个人主页:点我进入主页 专栏分类:C语言初阶      C语言程序设计————KTV       C语言小游戏     C语言进阶 C语言刷题 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂。 目录 1.前言      ...
    99+
    2023-10-02
    c语言
  • C++字符串的处理详解
    目录字符数组总结字符数组 双引号引起的a占两个字符,包含“\0”。 字符串处理函数 连接的时候,str2中的1替换str1中的‘\0'; 比较函数按照str...
    99+
    2022-11-12
  • 字符串 len == 0 和 字符串== "" 的区别有哪些
    这篇文章主要讲解了“字符串 len == 0 和 字符串== "" 的区别有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“字符串 len == 0 和 字符串== &...
    99+
    2023-06-15
  • C#字符串String及字符Char的方法怎么用
    这篇文章主要介绍了C#字符串String及字符Char的方法怎么用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#字符串String及字符Char的方法怎么用文章都会有所收获,下面我们一起来看看吧。一、字符串...
    99+
    2023-06-30
  • C++指针和数组:字符和字符串、字符数组的关联和区别
    目录一、字符指针、字符数组字符指针字符数组二、字符串指针三、(字符串)指针数组四、总结字符串的本质就是字符数组,将字符串作为字符数组来处理。字符数组和字符串都可以作为存放字符的数组,...
    99+
    2022-12-23
    C++字符 C++字符串 C++字符数组
  • C语言字符函数与字符串函数详解
    目录本章重点前言1.strlen函数注意点1注意点22.strcpy注意点1:注意点2:注意点3:注意点4:总结本章重点 重点介绍处理字符和字符串的库函数的使用和注意事项 1.求字符...
    99+
    2022-11-12
  • JavaScript的内置对象Math和字符串详解
    目录Math对象常用属性常用方法Math.random()字符串方法length属性charAt()charCodeAt()fromCharCode()concat()in...
    99+
    2022-11-12
  • C语言的字符函数和字符串函数详解
    目录0. 前言1.函数介绍及部分函数模拟实现1.1 strlen模拟实现1.2 strcpy模拟实现1.3 strcat模拟实现1.4 strcmp 模拟实现1.5 str...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作