C语言与C++中关于字符串使用的比较
作者:char~lie 发布时间:2022-01-22 01:30:37
相似处
  C++作为C的进阶版,可以调用C的库函数。C++标准库包括了C标准库,C++头文件cctype其实就利用了C的ctype.h中的库函数。在C++中使用C的头文件都会在前面加c,比如C的name.h在C++就是cname。
  为了与C兼容,C++有字符串字面值,也就是类似"hello world"这种,但是这和string类型不一样,视编译器而定string最后不一定有’\0’。
字符串字面值
  字符串字面值是一串常量字符,采用双引号括起来的零个或者多个字符表示,不可打印字符表示成相对应的转义字符:
"Hello World" //simple string literal
"" //empty string literal
"\nCC\toptions\t" //string literal using newlines and tabs
  为了兼容C语言,C++所有字符串字面值都由编译器自动在末尾添加一个空字符,和C语言一样:
'A' //single quote: character literal
"A" //double quote: character string literal
  表示包含字母A和空字符两个字符的字符串。
  表示包含字母A和空字符两个字符的字符串。
  也存在宽字符和宽字符串字面值,如:
L'a'
L"a wide string literal"
  宽字符串字面值是一串常量宽字符串,同样以宽空字符结束。
  两个相邻的仅由空格、制表符或换行符分开的字符串字面值(宽字符串字面值),可连接成一个新字符串字面值,使得多行书写长字符串字面值变得简单。
std::cout << "a multi-line"
"string literal"
"using concatenation"
<< std::endl;
  执行这条语句将会输出:
a multi-line string literal using concatenation
  但如果连接字符串字面值和宽字符串字面值,将会出错:
std::cout << "a multi-line"
L"string literal"
"using concatenation"
<< std::endl;
  其结果将是未定义的(undefined)。
  C++结构比较自由,甚至可以在单词中断行:
std::cou\
t << "Hi" << st\
d::endl;
  等价于:
std::cout << "Hi" << std::endl;
  可以用这个特性编写长字符串字面值:
std::cout << "a multi-line \
string literal \
using a backslash"
<<std::endl;
return 0;
  使用反斜线符号时这个符号必须是该行的尾字符,不允许后面有任何注释或者空格。
C++标准库string类型
string类型初始化
string s1; //默认构造函数,s1为空串
string s2(s1); //将s2初始化为s1的副本
string s3("value"); //将s3初始化为字符串字面值副本
string s4(n,'c'); //将s4初始化为字符'c'的n个副本
String对象的读写  
一个有用的string IO操作是getline,getline函数从输入流的下一行开始读取,保存读取的内容到string中,但不包括换行符,只要遇到换行符,哪怕是该行第一个字符,getline也将停止读入并返回。   
由于getline返回时丢弃换行符,换行符将不会存储在string对象中。下面给出一个使用getline读取字符串的例子:
int main()
{
string line;
while(getline(cin,line))
cout << line << endl;
return 0;
}
String对象的操作
s.empty() //s为空串返回true,否则返回false
s.size() //返回s中字符个数
s[n] //返回s中位置为n的字符,位置从0开始计数
s1+s2 //将s1和s2连接成一个新字符串
s1=s2 //将s1替换成s2副本
v1==v2 //比较v1和v2,相等返回true,否则返回false
!=,<,<=,>,>= //字符串比较
从逻辑上讲,size函数应该返回整型,然而事实上返回的是string::size_type类型,为避免溢出,在代码编写时最好用string::size_type。
关系操作符的比较规则和C的strcmp一样不赘述。
和字符串字面值的连接  
上述s1+s2连接的是字符串,字符串也是可以和字符串字面值连接的。   
由于编译器不同,string类型变量结尾的’\0’时有时无,但是有一点毫无疑问,两个字符串字面值是不能连接的。
string s1="hello";
string s2="world";
string s3=s1+"hi"; //没问题,字符串连接字符串字面值
string s4="hello"+"world"; //出错,+操作符不接受两个const char[]变量
string s5=s1+"hello"+"world" //没问题,每个+操作符都有string作为操作数
来源:https://blog.csdn.net/AEFDOGCCC/article/details/124709065


猜你喜欢
- 前言碎语今天博主安利一个国产开源的无服务器容器云平台,关注它已经有一年多了,虽然其迭代到现在很多功能还是一直处于测试验证中,但是其设计理念以
- 前言最近遇到很有意思转换二进制的问题,有部分童鞋俨然已了解,可能也有一部分童鞋没碰到过也就不知情,这里我们来深入学习下转换二进制所带来的问题
- 在windows应用程序中文档的打印是一项非常重要的功能,在以前一直是一个非常复杂的工作,Microsoft .Net Framework的
- 概述MerkleTree被广泛的应用在比特币技术中,本文旨在通过代码实现一个简单的MerkleTree,并计算出Merkle tree的 T
- 一、在idea中查看提交的历史记录右键单击项目单击git单击Show History结果展示:除了第一条记录是创建仓库默认就有的,
- 1、数组理论基础数组是存放在连续内存空间上的相同类型数据的集合,可以通过下标索引的方式获取到下标下对应的数据。举个栗子(字符数组)~可以看到
- 一.服务端代码:import java.net.*; // for Socket, ServerSocket, and InetAddres
- 本文实例讲述了Android编程实现任务管理器的方法。分享给大家供大家参考,具体如下:任务管理器可以实现的功能有:1.查看当前系统下运行的所
- 突然对悬浮窗体感兴趣,查资料做了个小Demo,效果是点击按钮后,关闭当前Activity,显示悬浮窗口,窗口可以拖动,双击后消失。效果图如下
- 在Android中因为不同像素手机的多样化,对于一张图片,放大不同的手机上因像素不同显示上也会有区别。现有如下需求:将一张图片宽度充满整个屏
- 下面给大家分享一个有趣的动画:这里比较适合一张图片的翻转,如果是多张图片,可以参考APIDemo里的例子,就是加个ArrayAdapter,
- LRU是Least Recently Used 的缩写,翻译过来就是“最近最少使用”,LRU缓存就是使用这种原理实现,简单的说就是缓存一定量
- Android开发文档上专门有一小节解释这个问题。简单来说,Activity是负责与用户交互的最主要机制,任何“设置”(Configurat
- 绝对路径:不可改变的路径本地绝对路径:增加盘符的路径(e:/test/test.html)网络绝对路径:增加协议,IP地址,端口号的路径(h
- Android ToggleButton 详解在Android的开发过程中,对于ToggleButton的使用频率也是相当的高的,下面我就来
- 一、前言微信接口调用验证最终需要用到的三个参数noncestr、timestamp、signature:接下来将会给出获取这三个参数的详细代
- 在线用户使用HttpSessionListener * 统计 每当一个session会话建立 在线用户人数+1每当一
- 废话不多说,直接上代码import java.text.SimpleDateFormat; import java.util.Date;/*
- 一个线程的生命周期:新建状态: 使用 new 关键字和 Thread 类或其子类建立一个线程对象后,该线程对象就处于新建状态。它保持这个状态
- Spring Boot+Vue 前后端分离项目架构项目流程:1. SpringBoot 后端项目1、新建一个 SpringBoot 工程,并