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;

&emsp;&emsp;执行这条语句将会输出:

a multi-line string literal using concatenation

&emsp;&emsp;但如果连接字符串字面值和宽字符串字面值,将会出错:

std::cout << "a multi-line"
             L"string literal"
             "using concatenation"
          << std::endl;

&emsp;&emsp;其结果将是未定义的(undefined)。

&emsp;&emsp;C++结构比较自由,甚至可以在单词中断行:

std::cou\
t << "Hi" << st\
d::endl;

&emsp;&emsp;等价于:

std::cout << "Hi" << std::endl;

&emsp;&emsp;可以用这个特性编写长字符串字面值:

std::cout << "a multi-line \
string literal \
using a backslash"
           <<std::endl;
           return 0;

&emsp;&emsp;使用反斜线符号时这个符号必须是该行的尾字符,不允许后面有任何注释或者空格。

C++标准库string类型

string类型初始化

string s1;   //默认构造函数,s1为空串
string s2(s1);   //将s2初始化为s1的副本
string s3("value");   //将s3初始化为字符串字面值副本
string s4(n,'c');     //将s4初始化为字符'c'的n个副本

String对象的读写&emsp;&emsp;

一个有用的string IO操作是getline,getline函数从输入流的下一行开始读取,保存读取的内容到string中,但不包括换行符,只要遇到换行符,哪怕是该行第一个字符,getline也将停止读入并返回。 &emsp;&emsp;

由于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一样不赘述。

和字符串字面值的连接&emsp;&emsp;

上述s1+s2连接的是字符串,字符串也是可以和字符串字面值连接的。 &emsp;&emsp;

由于编译器不同,string类型变量结尾的&rsquo;\0&rsquo;时有时无,但是有一点毫无疑问,两个字符串字面值是不能连接的。

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

标签:C语言,字符串,C++
0
投稿

猜你喜欢

  • 使用springboot打包成zip部署,并实现优雅停机

    2021-08-04 20:45:01
  • Java使用开源Rxtx实现串口通讯

    2023-06-13 19:15:47
  • SpringBoot2之PUT请求接收不了参数的解决方案

    2023-08-23 01:32:07
  • spring boot实现自动输出word文档功能的实例代码

    2021-11-10 13:37:51
  • mybatis plus使用redis作为二级缓存的方法

    2023-11-19 08:34:58
  • java 用itext设置pdf纸张大小操作

    2022-10-09 15:00:43
  • C#中将ListView中数据导出到Excel的实例方法

    2023-12-07 04:00:08
  • C#利用iTextSharp添加PDF水印

    2022-03-23 23:37:44
  • Java下http下载文件客户端和上传文件客户端实例代码

    2021-09-09 16:52:11
  • C#获取本地IP的四种方式示例详解

    2023-04-16 00:52:50
  • spring boot 2.x html中引用css和js失效问题及解决方法

    2021-08-13 10:28:32
  • Java邮件发送程序(可以同时发给多个地址、可以带附件)

    2022-09-07 20:08:40
  • springboot 自定义权限标签(tld),在freemarker引用操作

    2023-11-23 06:20:15
  • java8使用filter()取出自己所需数据

    2023-04-07 02:30:37
  • Java泛型常见面试题(面试必问)

    2021-11-20 20:51:55
  • C# 操作XML文档 使用XmlDocument类方法

    2023-06-11 04:21:14
  • 使用Spring Cloud Feign作为HTTP客户端调用远程HTTP服务的方法(推荐)

    2022-11-09 11:40:37
  • Java中JUC 的 Exchange 交换器详情

    2023-09-17 18:46:40
  • Android列表控件Spinner简单用法示例

    2023-03-06 07:36:22
  • java实现二分法的完整代码

    2023-08-18 22:09:06
  • asp之家 软件编程 m.aspxhome.com