(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 ...
随机推荐
- ThreadLocal(线程绑定)
为保证在DAO层里的操作都在同一事务里,我们曾使用以参数的形式将Connection向下传递的方式,而ThreadLocal来创建Connection连接,避免了一直以参数的形式将Connection ...
- 初始化nodejs+webpack+vuejs
安装nodejs 4.x 参考 curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash - sudo apt-get install ...
- Bootstrap3 排版-引用
在你的文档中引用其他来源的内容. 默认样式的引用 将任何 HTML 元素包裹在 <blockquote> 中即可表现为引用样式.对于直接引用,我们建议用 <p> 标签. Lor ...
- 剑指Offer——毕业生求职网站汇总(干货)
剑指Offer--毕业生求职网站汇总(干货) 致2017即将毕业的你~ 精品网站 牛客网:https://www.nowcoder.com 赛码网:http://www.acmcoder.com/ 招 ...
- ROS机器人程序设计(原书第2版)补充资料 (陆) 第六章 点云 PCL
ROS机器人程序设计(原书第2版)补充资料 (陆) 第六章 点云 PCL 书中,大部分出现hydro的地方,直接替换为indigo或jade或kinetic,即可在对应版本中使用. RGBD深度摄像头 ...
- RxJava操作符(06-错误处理)
转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51658235 本文出自:[openXu的博客] 目录: Catch Retry 源码下载 1 ...
- 文件自动备份和同步bypy和syncthing
http://blog.csdn.net/pipisorry/article/details/52464402 Linux定时备份数据到百度云盘 sudo pip3 install requestss ...
- 开源IMDG之GridGain
作为另一款主流的开源数据网格产品,GridGain是Hazelcast的强有力竞争者.同样提供了社区版和商业版,近日GridGain的开源版本已经进入Apache孵化器项目Ignite(一款开源的内存 ...
- Android加速度传感器
Android加速度传感器 效果图 手机平放桌面的两张截屏,数据一直在刷新 源码 下载地址(Android Studio工程):http://download.csdn.net/detail/q487 ...
- 1QPushButton的使用,QLineEdit的使用,设置组件位置,布局(QHBoxLayout,QGridLayout)
1.新建一个空Qt项目 2 新建一个新的文件(右击项目à添加新文件) 3 配置pro文件属性 SOURCES += \ main.cpp QT += widgets gui 4 编写main.c ...