前面说了写关于数组和指针的内容,这次在这里讨论一下字符串,讨论一下C语言风格的字符串。 在C语言里面我们利用字符数组来对字符串进行处理,

在C++里面我们前面说过一种类类型string可以对字符串进行处理, 这里需要引起注意,因为两种机制存在一定的区别。

一、字符串

1、字符串字面值

  利用左、右分号 " 和 " 括起来的字符是一个字符串字面值, 字符串字面值可以自引用,可以通过数组、指针进行引用。如下所示:

  ""       空字符串, 占用1个字节, 这个字节用来存储空字符:'\0'

  "volcanol"   字符串volcanol.

int main()
{"volcanol";  //do nothing
cout<<sizeof("")<<endl;return 0;
}

程序的执行结果如下所示:

[root@localhost cpp_src]# g++ test.cpp
[root@localhost cpp_src]# ./a.out
1

2、字符串数组、字符串与指针

  在定义字符数组的时候,可以通过字符串字面值在定义的时候进行初始化,如下所示。字符串数组可以通过下标来访问,同时也可以通过指针来访问,具体

实例如下所示。

Exp:

int main()
{char cStrArray[]="volcanol";for(size_t i=0; i != sizeof("volcanol"); i++)cout<<cStrArray[i]<<endl;char *pCh = "volcanol";for(;*pCh != '\0';pCh++)cout<<*pCh<<endl;cout<<endl;char *pCh1 = "volcanol";for(;*pCh1 != '\0';++pCh1)cout<<*pCh1<<endl;return 0;
}

程序执行的街结果如下所示:

[root@localhost cpp_src]# g++ test.cpp
[root@localhost cpp_src]# ./a.out
v
o
l
c
a
n
o
lv
o
l
c
a
n
o
lv
o
l
c
a
n
o
l

  这里要多说一句,字符串字面值的数据类型为 const char * 类型,我们定义的数组和指针一般都不会定义为const的, 如果确定不能改变数组的内容,则可以将

数组定义为const类型的,这样就可以避免不修改数组的内容。 利用指针和字符串字面值进行操作的时候,需要注意在指针没有改变指向的时候,不能通过指针来修改

字符串字面值的值。

int main()
{char *pCh ="volcanol";*pCh = 'A';cout<<*pCh<<endl;return 0;
}

这段代码编译不会出错,但是运行的时候会出现段错误, 执行情况如下所示:

[root@localhost cpp_src]# g++ test.cpp
[root@localhost cpp_src]# ./a.out
段错误

就是通常说的segment error。

3、利用字符串本身访问

  字符串本身具有一个特殊的特性,字符串字面值本身就具有字符数组名的作用。如下所示:

int main()
{for(size_t i = 0; i != sizeof("volcanol"); i++)cout<<("volcanol"[i])<<endl;return 0;
}

和下面的例子:

int main()
{//for(size_t i = 0; i != sizeof("volcanol"); i++)//cout<<("volcanol"[i])<<endl;for(size_t i=0; i!=sizeof("volcanol");i++)cout<<"volcanol"[i]<<endl;return 0;
}

  这个地方的实例要注意字符串字面值的和下标操作符的使用。两个程序的执行结果都如下所示:

[root@localhost cpp_src]# g++ test.cpp
[root@localhost cpp_src]# ./a.out
v
o
l
c
a
n
o
l

4、字符串中的转义字符

  在字符串字面值中需要注意转义字符的组成,这一点需要特别注意。如下所示:

int main()
{cout<<"volcnaol\thi,nice to meet you"<<endl;printf("volcanox\thi,nice to meet you\n");return 0;
}

程序执行的情况如下:

[root@localhost cpp_src]# vim test.cpp
[root@localhost cpp_src]# g++ test.cpp
[root@localhost cpp_src]# ./a.out
volcnaol        hi,nice to meet you
volcanox        hi,nice to meet you

今天发现编译器的一个特殊情况:当我们同时连续输出\b\t 的时候,会出现“淹没”的情形。

int main()
{cout<<"volcnaol\b\thi,nice to meet you"<<endl;printf("volcanol\b\thi,nice to meet you\n");return 0;
}

程序执行的结果如下所示:

[root@localhost cpp_src]# g++ test.cpp
[root@localhost cpp_src]# ./a.out
volcnaolhi,nice to meet you
volcanolhi,nice to meet you

可以发现这个地方执行的结果与我们预期不一样。就是我说的出现了“淹没”的情形\b 和 \t的效果全淹没啦。

5、 cstring头文件支持

  C语言中提供了很多标注库函数支持字符串的操作,通过包含头文件<string.h>的实现引进库, 而在C++中通过头文件<cstring>提供支持,提供的函数有:

  strlen   字符串长度,不包括最后的空字符null;

  strcmp(str1,str2)    按照字典序比较str1、str2, 若str1> str2则返回正数, 若str1== str2则返回0, 如果str1<str2则返回负数; 注意这个函数区分

                字符的大小写

  strcat(str1, str2)     将字符串str2连接到str1之后, 这个函数需要保证 sizeof(str1) >= strlen(str1) + strlen(str2); 函数返回str1。

  strcpy(str1,str2)    将字符串str2复制到str1中,注意要保证 sizeof(str1) >= str2 ; 函数返回str1;

  strncat(str1,str2,n)   将字符串str2的前n个字符,连接到字符串str1之后,函数返回str1;

    strncpy(str1,str2,n)  将字符串str2的前n个字符,复制到字符串str中,函数返回str1;

  cstring提供的支持要注意留足够的空间来进行操作,否则就会出现异常, 同时要注意字符串最后的null字符的特殊性。

二、动态数组

  数组在定义的时候需要指定数组的大小,而且指定数组大小必须是一个整型字面值或者cosnt修饰的整型变量或者可以在编译时计算出结果的整型表达式。

C++提供了另外的一种机制-----动态数组, 在定义的时候可以通过变量来指定数组的大小。

  在程序运行的时候系统会为程序维护一块特殊的内存区域,这块内存区域在程序运行的时候用于程序来自由的使用,但是需要程序自己来管理,这块区域

就是堆区域(heap)。

1、定义动态数组

  在C++中通过new操作符来定义动态数组。例如定义一个int型的动态数组,如下所示:

  int  array_size;cout<<"please input the size of the array you want alloc:";cin>>array_size;  int *pInt = new int[array_size];

  这里我们可以看到我们可以动态的定义数组,可以根据实际需要来分配数组的大小。操作符 new 返回指向数组第一个元素的地址,这里这个地址用来初始化int *

的指针pInt。这样定义后,就可以利用指针来访问新分配的数组了,如下所示:

int main()
{int array_size;cout<<"please input the size of array you want alloc:";cin>>array_size;int *pInt = new int[array_size];for(size_t i = 0; i != array_size; ++i)*(pInt + i ) = i;for(size_t i = 0; i != array_size; i++)cout<<*(pInt + i)<<endl;return 0;
}

程序执行的结果如下:

[root@localhost cpp_src]# ./a.out
please input the size of array you want alloc:5
0
1
2
3
4

2、释放动态分配的内存

  为了定义动态数组需从堆里面分配的内存,这些内存需要在不使用的时候进行释放,否则申请多了就会将系统的内存耗尽,造成内存泄露。

  C++用 delete操作符来释放动态分配的内存。如下所示:

Exp:

 int array_size;cout<<"please input the size of array you want alloc:";cin>>array_size;int *pInt = new int[array_size];delete [] pInt;

  这里就将申请的内存空间释放完毕,相当于C语言标准库中的free()函数.

转载于:https://www.cnblogs.com/volcanol/p/4008333.html

C++_系列自学课程_第_9_课_C语言风格字符串_《C++ Primer 第四版》相关推荐

  1. C++_系列自学课程_第_12_课_结构体

    1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 struct CDAccount ...

  2. c语言谭浩强ppt课件,编程_C语言学习课件_谭浩强_PPT~1216F.ppt

    编程_C语言学习课件_谭浩强_PPT~1216F.ppt ,第一章,C语言概述本章要点,C语言的特点 C程序的结构 在计算机上运行C程序的方法主要内容,1.1 语言出现的历史背景 1.2 程序的特点 ...

  3. c语言怎么把一个整数挨挨挤挤,《C语言》课程PPT_第1章_C语言基础

    C语言基础 第一章 传褪猿度历霞司腺娠详躁代升乍圃刷烘诧藩东兹淮驹耿游竿郝芽祖续憨荫 C语言 课程PPT 第1章 C语言基础 C语言 课程PPT 第1章 C语言基础 2 本章目标 命令 程序以及软件之 ...

  4. 湖南文理学院c语言题库,湖南文理学院_通讯录管理系统课程设计归纳总结报告书(C语言)(21页)-原创力文档...

    湖南文理院学 二〇一〇学年 第 二 学期 电气与信息工程学院 课程设计报告书 课程名称: C语言课程设计 班 级: 通信09102班 学 号: 200916020216 姓 名: 颜文武 指导老师: ...

  5. r语言中mpg数据_零基础生信入门第一课——R语言数据清洗,超详细讲解,建议收藏!...

    小伙伴们大家好!今天我要用一篇推文精要概括数据清洗中的最基本最关键的步骤,对于零基础的学员一定会有很大收获!数据清洗是完成一篇生信文章最基本但也是最终要的准备工作,如果不会数据清洗,就要错过很多优质数 ...

  6. c语言输入字符串_我们一起学C语言(四)

    C语言来喽~ 每日一句 我关心我自己, 愈是孤单, 愈是没有朋友, 愈是无助, 那我就愈是自尊. --<简爱> 表达式 在上一篇中,我们已经学习了运算符,接下来我们来看如何运用这些运算符写 ...

  7. angular语言前端开发_详解使用angular-cli发布i18n多国语言Angular应用_唇印_前端开发者...

    在模板 Hello world! 使用ng命令产生xlf格式的message.xlf文件 $ ng xi18n --output-path src/i18n 命令执行后,生成 src/i18n/mes ...

  8. java 从控制台输入一个正整数_编程输出该正整数各位数字之和_C语言 从键盘上输入一个正整数,计算并输出该数的各位数字之和...

    点击查看C语言 从键盘上输入一个正整数,计算并输出该数的各位数字之和具体信息 答:思路:定义变量a接受键盘输入和变量sum保存a的各位数字之和,依次对a进行除10操作,并把a除10的余数加到sum中, ...

  9. c语言递归法1 2 n,递归法_C语言递归法_递归算法经典实例(2)

    在网上搜索梵塔游戏fanta.exe,自己动手,体会梵塔问题,尝试解决问题. 3 问题分析 教师提出问题: 1. 盘子移动过程中的两个要求? 2. 寻找规律:(教师引导,学生描述移动过程) (1)两个 ...

最新文章

  1. k8s kafka集群 连接不上_图解 K8s 核心概念和术语
  2. C语言经典例79-字符串排序
  3. 基于select模型的TCP服务器
  4. 如何让 Flutter 应用更好地使用 SVG?
  5. oracle 备份教研归档失败,归档日志丢失造成Rman备份失败解决办法
  6. ASP.NET Web API中实现版本
  7. vue路由跳转动画_Vue路由跳转动画
  8. RedisTemplate 数据结构 使用方法
  9. c语言许多名字随机抽取名字,怎么用ppt实现一个随机抽取名字的功能
  10. [样本分析] 海莲花CS样本
  11. EF MYSQL批量更新_Entity Framework Core 5中实现批量更新、删除
  12. 解决:vue组件顶部留有空白问题
  13. python3下载手机安卓版,python3.0手机版下载
  14. ROS中执行roslaunch后,显示功能包不存在的解决方法
  15. 2021年医疗健康产业数字化研究报告 附下载
  16. NCS再探--nRF5340 Audio
  17. [人工智能-数学基础-1]:深度学习中的数学地图:计算机、数学、数值计算、数值分析、数值计算、微分、积分、概率、统计.....
  18. 商用密码的发展历程及当前应用情况
  19. GPS从入门到放弃(十) 、定位方程解算和定位精度
  20. 投影仪变焦镜头行业调研报告 - 市场现状分析与发展前景预测

热门文章

  1. Flutter Raw Image Provider
  2. 5、SpringBoot 发送邮件
  3. rman删除7天前备份_RMAN备份
  4. c语言16x32点阵显示汉字,点阵16*32滚屏显示汉字
  5. java jdk目录_Java开发工具包JDK安装和目录介绍
  6. java 采集rtsp_通过Java程序调用RTSP拉流协议视频平台EasyNVR程序接口步骤概览
  7. 德华安顾人寿签约神策数据,精耕数字化加速保险服务质效升级
  8. 节前福利 | 三位大佬带你从客户成功、销售、市场端打造 To B 运作体系 !
  9. 用户分群模型:如何打造精细化运营基石?
  10. Google API 设计指南 - 前言