(C++)string类杂记
本文特记录C++中string类(注意string是一个类)的一些值得注意的地方。
string类的实例是以‘\0'结束的吗?
这个问题有时还真容易混淆,因为我们可能会将 C++ 语言中的string类的实例跟 C 语言的字符串相混淆。在 C 语言中,字符串是以’\0'结束的字符数组。但C++还提供了string类,跟 C 语言字符串是完全不一样的东西,但却容易相互混淆。
我们先来看一下,对于string类而言,'\0'跟其他字符是否有不一样的意义。
实际上,‘\0’在string类之中并不具有特殊意义,它跟其他字符的地位完全相同。为了证明这个说法,我们来看一个例子:
#include <iostream>
#include <string>
using namespace std; int main()
{
string in{"abc"};
in.push_back('\0');
in.append("def");
cout << in << endl; return ;
}
我们将断点设定在第10行,可以发现有如此结果:

另外,程序输出如下:

从上述结果可以看出,'\0'在string类中确跟其他字符的地位一样。
同时,我们也可以知道string类的实例并不以'\0'结束。不过,我们再看看下边例子,我们可能会动摇这个结论:
#include <iostream>
#include <string>
using namespace std; int main()
{
string in{"abcdef"};
int i = ;
while (in[i] != '\0')
{
cout << in[i] << " ";
i++;
}
cout << endl; return ;
}
程序运行结果如下:

从这个程序来看,string类的实例好像又是以'\0'结束的。实际上,是操作符'[]'捣的鬼。对于string类而言,操作符’[]‘并不检查索引是否有效,所以当索引越界时,操作符'[]'的访问行为是不明确的。不过对于string类而言,用操作符'[]'访问第length()个字符时会返回'\0',而对第length()+1以上的访问会使得程序崩溃。这个可以通过上边程序的 in 变量的原始视图来验证到:

但是这并不能证明string类的实例就以'\0'结束。如果我们用string类提供的会进行类型检查的成员函数 at 来访问实例中的字符,就会发现上一程序会发生越界错误:
#include <iostream>
#include <string>
using namespace std; int main()
{
string in{"abcdef"};
int i = ;
while (in.at(i) != '\0')
{
cout << in[i] << " ";
i++;
}
cout << endl; return ;
}
程序运行时错误:

综上所述,‘\0’在string类之中并不具有特殊意义,它跟其他字符的地位完全相同,而且string类的实例也并不以'\0'结束。
string类实例与 C 语言字符串转换
将string类实例转换为 C 语言字符串是比较常见的,一般利用的是c_str()函数,如下例:
#include <iostream>
#include <string>
using namespace std; int main()
{
string in{""}; char *cstr = const_cast<char *>(in.c_str());
printf("%s\n", cstr); int str2Int = atoi(cstr);
printf("%d\n", str2Int); return ;
}
string::npos
npos是string类的一个公有静态成员变量,定义如下:
static const size_t npos = -;
它主要有两个用处:
1. 当作为成员函数参数 len 的默认数值时,表示“until the end of the string”。
如str.substr(pos)表示截取从pos到str最末尾的字符串。
2. 作为成员函数返回值表示没有匹配。
如str.substr("test")若返回string::npos则表示在str中找不到test子串。
(C++)string类杂记的更多相关文章
- 标准库String类
下面的程序并没有把String类的所有成员方法实现,只参考教程写了大部分重要的成员函数. [cpp] view plain copy #include<iostream> #include ...
- 自己实现简单的string类
1.前言 最近看了下<C++Primer>,觉得受益匪浅.不过纸上得来终觉浅,觉知此事须躬行.今天看了类类型,书中简单实现了String类,自己以前也学过C++,不过说来惭愧,以前都是用C ...
- C++ string类的实现
c++中string类的实现 今天面试被考到了, 全给忘记了!!! //string类的实现 #include <iostream> #include <string.h> ...
- String类的功能
String类 标红的为较少出现的 1.判断功能 boolean equals(Object obj) :比较字符串内容是否相同,区分大小写 boolean equalsIg ...
- java基础复习:final,static,以及String类
2.final 1)为啥String是final修饰的呢? 自己答: 答案: 主要是为了“效率” 和 “安全性” 的缘故.若 String允许被继承, 由于它的高度被使用率, 可能会降低程序的性能,所 ...
- String类和StringBuffer类的区别
首先,String和StringBuffer主要有2个区别: (1)String类对象为不可变对象,一旦你修改了String对象的值,隐性重新创建了一个新的对象,释放原String对象,StringB ...
- 05_整理String类的Length()、charAt()、 getChars()、replace()、 toUpperCase()、 toLowerCase()、trim()、toCharArray()使用说明
Question: 整理String类的Length().charAt(). getChars().replace(). toUpperCase(). toLowerCase().trim().toC ...
- 标准C++中的string类的用法总结
标准C++中的string类的用法总结 相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有 ...
- String类常用方法
1.String类的特点,字符串一旦被初始化就不会被改变. 2.String对象定义的两种方式 ①String s = "affdf";这种定义方式是在字符串常量池中创建一个Str ...
随机推荐
- iOS开源照片浏览器框架SGPhotoBrowser的设计与实现
简介 近日在制作一个开源加密相册时附带着设计了一个照片浏览器,在进一步优化后发布到了GitHub供大家使用,该框架虽然没有MWPhotoBrowser那么强大,但是使用起来更为方便,操作更符合常规相册 ...
- postgresql 登录查看表定义
su - postgres psql \connect database_name; \d table_name
- python用openpyxl操作excel
python操作excel方法 1)自身有Win32 COM操作office但讲不清楚,可能不支持夸平台,linux是否能用不清楚,其他有专业处理模块,如下 2)xlrd:(读excel)表,xlrd ...
- markdown绘图插件----mermaid简介
作者:黄永刚 mermaid简介 当撰写文档的时候,对于流程图的生成大多使用Visio等繁重的工具,没有一种轻便的工具能够画图从而简化文档的编写,就像markdown那样. mermaid解决这个痛点 ...
- Lua语言模型 与 Redis应用
Lua语言模型 与 Redis应用 标签: Java与NoSQL 从 2.6版本 起, Redis 开始支持 Lua 脚本 让开发者自己扩展 Redis. 本篇博客主要介绍了 Lua 语言不一样的设计 ...
- iOS 10 适配 ATS
一. HTTPS 其实HTTPS从最终的数据解析的角度,与HTTP没有任何的区别,HTTPS就是将HTTP协议数据包放到SSL/TSL层加密后,在TCP/IP层组成IP数据报去传输,以此保证传输数据的 ...
- MS Office2016留下的坑
背景 问题源自论坛用户反馈,他用管家有几年了,之前使用IE都很正常,没有任何问题,但是最近突然发现,启动IE时,就会出现系统错误提示:无法启动此程序,因为计算机中丢失 api-ms-win-core- ...
- ROS机器人程序设计(原书第2版)学习镜像分享及使用说明
ROS机器人程序设计(原书第2版)学习镜像分享及使用说明 系统用于ROS爱好者学习交流,也可用于其他用途,并不局限于ROS. 这款镜像文件是基于一年前的Ubuntu ROS Arduino Gazeb ...
- EBS销售订单挑库发放处理程序
来自:http://blog.csdn.net/cunxiyuan108/article/details/6014769 在EBS实施中,经常遇到从外部传进来一个被登记的销售订单,需要通过程序进行销售 ...
- 使用std::vector优化点云动画显示一例
1. 准备 使用std::vector应该知道几点: (1)内存连续的容器,有点像数组 (2)与std::list相比,插入和删除元素比较慢- 因为数据迁移 (3)添加元素可能会引发内存分配和数据迁移 ...