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
![](https://www.aspxhome.com/images/zang.png)
![](https://www.aspxhome.com/images/jiucuo.png)
猜你喜欢
- 子类重新实现父类的方法称重写;重写时可以修改访问权限修饰符和返回值,方法名和参数类型及个数都不可以修改;仅当返回值为类类型时,重写的方法才可
- 智能终端上的游戏目前风头正劲,试问哪个智能手机上没有几款企鹅公司出品的游戏呢!之前从未涉猎过游戏开发,但知道游戏开发前要挑选一款合适的游戏引
- C#中的string是比特殊的类,说引用类型,但不存在堆里面,而且String str=new String("HelloWorl
- 最近在做一个项目,遇到了项目打成 war 包的一个问题,项目创建时选择的时 jar 包方式,后因项目部署要求,需要打成 war 包部署,遇到
- 本文实例为大家分享了抢红包源码,供大家参考,具体内容如下1. 正确获取红包流程2. 软件介绍2.1 效果图:2.2 功能介绍2.2.1 账号
- 获取map的值主要有四种方法,这四种方法又分为两类,一类是调用map.keySet()方法来获取key和value的值,另一类则是通过map
- 本文实例讲述了C#中foreach原理以及模拟的实现方法,分享给大家供大家参考。具体如下:public class Person:IEnum
- //计算字符串的MD5值 public string G
- Mybatis-plus全局id生成策略在配置文件中加入以下代码后就不需要在实体类种的id上添加@TableId(value = “id”,
- 作为程序员,开发完一段代码,实现了某个功能时,有必要知道:我的程序需要多长时间?是什么导致我的程序消耗很多内存?比如,统计或者处理了一大批数
- 一:问题引入前面讲到用户支付完成之后微信支付服务器会发送回调通知给商户,商户要能够正常处理这个回调通知并返回正确的状态码给微信支付后台服务器
- 本文实例讲述了c#使用Dataset读取XML文件动态生成菜单的方法。分享给大家供大家参考。具体实现方法如下:Step 1:Form1 上添
- 一、封装封装:是面向对象方法的重要原则,就是把对象的属性和行为(数据)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节,就是把不想告诉或
- 本文实例分析了C#动态生成DropDownList执行失败原因。分享给大家供大家参考。具体如下:今天研究DDL控件的动态生成的时候遇到了点问
- 一、概述数据透视表(Pivot Table)是一种交互式的表,可以进行某些计算,如求和与计数等,可动态地改变透视表版面布置,也可以重新安排行
- 我就废话不多说了,大家还是直接看代码吧~<!-- 查询物品的id --><select id="checkIte
- 本文实例为大家分享了java实现上传图片尺寸修改和质量压缩的具体代码,供大家参考,具体内容如下package com.zity.frame.
- 微信跳一跳辅助的Java具体实现代码,供大家参考,具体内容如下1.参考知乎教你用Python来玩微信跳一跳,鉴于本人Python一直都是半吊
- 前言我们在使用spring security的时候可以通过好几种方法获取用户信息, 但是今天这篇文章介绍的是一个笔者觉得最优雅的实现; 借鉴
- 引入第三方jar包或者查看Java源码的时候,经常遇到问题如下:decompiled.class file bytecode version