C++_系列自学课程_第_9_课_C语言风格字符串_《C++ Primer 第四版》
前面说了写关于数组和指针的内容,这次在这里讨论一下字符串,讨论一下C语言风格的字符串。 在C语言里面我们利用字符数组来对字符串进行处理,
在C++里面我们前面说过一种类类型string可以对字符串进行处理, 这里需要引起注意,因为两种机制存在一定的区别。
一、字符串
1、字符串字面值
利用左、右分号 " 和 " 括起来的字符是一个字符串字面值, 字符串字面值可以自引用,可以通过数组、指针进行引用。如下所示:
"" 空字符串, 占用1个字节, 这个字节用来存储空字符:'\0'
"volcanol" 字符串volcanol.
int main()
{
"volcanol"; //do nothing cout<<sizeof("")<<endl; return ;
}
程序的执行结果如下所示:
[root@localhost cpp_src]# g++ test.cpp
[root@localhost cpp_src]# ./a.out
2、字符串数组、字符串与指针
在定义字符数组的时候,可以通过字符串字面值在定义的时候进行初始化,如下所示。字符串数组可以通过下标来访问,同时也可以通过指针来访问,具体
实例如下所示。
Exp:
int main()
{
char cStrArray[]="volcanol"; for(size_t i=; 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 ;
}
程序执行的街结果如下所示:
[root@localhost cpp_src]# g++ test.cpp
[root@localhost cpp_src]# ./a.out
v
o
l
c
a
n
o
l v
o
l
c
a
n
o
l v
o
l
c
a
n
o
l
这里要多说一句,字符串字面值的数据类型为 const char * 类型,我们定义的数组和指针一般都不会定义为const的, 如果确定不能改变数组的内容,则可以将
数组定义为const类型的,这样就可以避免不修改数组的内容。 利用指针和字符串字面值进行操作的时候,需要注意在指针没有改变指向的时候,不能通过指针来修改
字符串字面值的值。
int main()
{
char *pCh ="volcanol";
*pCh = 'A';
cout<<*pCh<<endl;
return ;
}
这段代码编译不会出错,但是运行的时候会出现段错误, 执行情况如下所示:
[root@localhost cpp_src]# g++ test.cpp
[root@localhost cpp_src]# ./a.out
段错误
就是通常说的segment error。
3、利用字符串本身访问
字符串本身具有一个特殊的特性,字符串字面值本身就具有字符数组名的作用。如下所示:
int main()
{
for(size_t i = ; i != sizeof("volcanol"); i++)
cout<<("volcanol"[i])<<endl; return ;
}
和下面的例子:
int main()
{
//for(size_t i = 0; i != sizeof("volcanol"); i++)
//cout<<("volcanol"[i])<<endl; for(size_t i=; i!=sizeof("volcanol");i++)
cout<<"volcanol"[i]<<endl; return ;
}
这个地方的实例要注意字符串字面值的和下标操作符的使用。两个程序的执行结果都如下所示:
[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 ;
}
程序执行的情况如下:
[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 ;
}
程序执行的结果如下所示:
[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 = ; i != array_size; ++i)
*(pInt + i ) = i; for(size_t i = ; i != array_size; i++)
cout<<*(pInt + i)<<endl; return ;
}
程序执行的结果如下:
[root@localhost cpp_src]# ./a.out
please input the size of array you want alloc:
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()函数.
C++_系列自学课程_第_9_课_C语言风格字符串_《C++ Primer 第四版》的更多相关文章
- C++_系列自学课程_第_7_课_数组_《C++ Primer 第四版》
说到数组,大家应该都很熟悉,在C.Pascal.Java等语言中,都有数组的概念.在C++中也提供了对数组的支持.数组简单来说就是一堆相同 数据类型对象的集合. 这里要把握住两个要点: 相同的数据类型 ...
- C++_系列自学课程_第_6_课_bitset集_《C++ Primer 第四版》
在C语言中要对一个整数的某一个位进行操作需要用到很多的技巧.这种情况在C++里面通过标准库提供的一个抽象数据类型 bitset得到了改善. 一.标准库bitset类型 1.bitset的作用 bits ...
- C++_系列自学课程_第_5_课_vector容器_《C++ Primer 第四版》
再一次遇到 vector 这个单词; 每一次见到这个单词都感觉这个单词非常的 "高大上"; 数字遇到vector马上就可以360度旋转: 当 "电" 遇到vec ...
- C++_系列自学课程_第_3_课_变量和基本类型_《C++ Primer 第四版》
最近复习C++相关内容,决定在这里记录自己复习的过程. 以前写过部分文字,但是没有坚持连续写,因此学完后 基本又忘光啦,主要是没有实践,这一次决定自学完后,在这里在复习一遍增强自己的记忆和理解程度. ...
- C++_系列自学课程_第_12_课_结构体
#include <iostream> #include <string> using namespace std; struct CDAccount { double bal ...
- C++_系列自学课程_第_12_课_语句_《C++ Primer 第四版》
前面的文章说完了表达式和类型转换的部分内容,在我参考的书里面,接下来讨论的是各种语句,包括:顺序语句.声明语句.复合语句(块语句).语句作用域 .if语句.while语句.for语句.do...whi ...
- C++_系列自学课程_第_11_课_类型转换_《C++ Primer 第四版》
上次说了关于表达式的一些内容,说到还有一些关于数据类型转换的内容,今天我们接着八一八C++中的数据类型转换. 一.隐式类型转换 在表达式中,有些操作符可以对多种类型的操作数进行操作, 例如 + 操作符 ...
- C++_系列自学课程_第_10_课_表达式_《C++ Primer 第四版》
程序设计语言中大部分程序都在进行表达式的求值操作, 例如求两个数的和,求一个表达式的逻辑结果,或者通过输入输出表达式语句进行输入和输出. 这里我们对表达式进行讨论. 一.表达式 1.表达式 表达式由一 ...
- C++_系列自学课程_第_8_课_指针和引用_《C++ Primer 第四版》
C语言最富有迷幻色彩的部分当属指针部分,无论是指针的定义还是指针的意义都可算是C语言中最复杂的内容.指针不但提供给了程序员直接操作硬件部分的操作接口,还提供给了程序员更多灵活的用法.C++继承这一高效 ...
随机推荐
- Alljoyn之管中窥豹
Alljoyn之管中窥豹 一.历史: Alljoyn是高通2011年推出的近距离P2P通讯技术,它为分布式应用程序在不同设备中提供了运行环境,特别是移动性.安全性和动态配置,支持Microsoft W ...
- 我的LESS编译方案
背景 近期项目前端决定使用less,简单介绍一下,详细信息有兴趣查看官方文档(http://www.lesscss.net/article/home.html) LESSCSS是一种动态样式语言,属于 ...
- Qcon会议之所见所想
作为普通码农一枚,Qcon是俺参与过的最高级的技术大会了.大会共历时三天,因为俺第二天就得赶火车休个五一大长假,所以只参加了第一天4/25号的会议(其他俩天自然有其他同事会去观摩),不过第一天的会议有 ...
- Ubuntu 16 安装ElasticSearch
首先安装Java,参见博客:http://www.cnblogs.com/1zhk/p/6056406.html 下载ElasticSearch安装包 curl -L -O https://artif ...
- How to Use Android ADB Command Line Tool
Android Debug Bridge (adb) is a tool that lets you manage the state of an emulator instance or Andro ...
- fir.im Weekly - 让 iOS 应用更加安全
攻易防难,关于 iOS 应用安全看起来有些神秘.iOS Security , 源于@吴发伟_则平博客翻译的关于iOS安全的一系列文章,现在站点已经系统收集了大量关于 iOS 逆向.安全.反编译.静动态 ...
- 移动开发--Hybrid和Native混合开发-->HybridApp 、NativeApp、WebApp
1.1. APP三种开发模式 智能手机之普及不用多说,手机APP渗投到各个行业:电商(淘宝.京东等).金融(各手机行业.P2P借贷等).医疗(智慧医疗).交通(滴滴.Uber等).教育(慕课网 ...
- Mysql命令show global status求根溯源
近来,发现好多公司对mysql的性能监控是通过show global status实现的,因此对于这个命令想要探究一番,看他是否是实时更新的. 在此之前,我们必须搞明白mysql对于这个命令的执行过程 ...
- 记住密码超简单实现(C#)
实现效果如下 实现过程 [Serializable] class User { //记住密码 private string loginID; public string LoginID { get { ...
- A Simple OpenCASCADE Qt Demo-occQt
A Simple OpenCASCADE Qt Demo-occQt eryar@163.com Abstract. OpenCASCADE have provided the Qt samples ...