(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 ...
随机推荐
- springMVC源码分析--HttpRequestHandlerAdapter(四)
上一篇博客springMVC源码分析--HandlerAdapter(一)中我们主要介绍了一下HandlerAdapter接口相关的内容,实现类及其在DispatcherServlet中执行的顺序,接 ...
- vbs注册表增删改
vbs注册表增删改非常简单.过去竟然能忍受那么多次手动在注册表编辑器操作...应该认真反思自己的懒惰了. Dim op Set op=WScript.CreateObject("WScrip ...
- IMDG产品功能扩展
开源IMDG通常都提供了SPI或其他接口,供用户自行扩展.以Hazelcast为例,我们可以用一些好玩的小工具增强其查询.Map和后端持久化的功能.这些小工具虽然看起来很小,但功能也非常强大. SQL ...
- Linux 高性能服务器编程——Linux服务器程序规范
问题聚焦: 除了网络通信外,服务器程序通常还必须考虑许多其他细节问题,这些细节问题涉及面逛且零碎,而且基本上是模板式的,所以称之为服务器程序规范. 工欲善其事,必先利其器,这篇主要来探 ...
- Android 的 Sqlite基本操作
在 SQL 数据库中保存数据 使用数据库 将数据保存到数据库对于重复或结构化数据(比如契约信息)而言是理想之选. 本课程假定您基本熟悉 SQL 数据库并且可帮助您开始在 Android 中使用 SQL ...
- Android动态换肤(二、apk免安装插件方式)
在上一篇文章Android动态换肤(一.应用内置多套皮肤)中,我们了解到,动态换肤无非就是调用view的setBackgroundResource(R.drawable.id)等方法设置控件的背景或者 ...
- 1.使用C++封装一个链表类LinkList
使用C++封装一个链表类LinkList.写出相应一个测试用例 链表需要提供 添加 修改删除 除重 合并 排序创建 销毁等接口. 不能调用库函数或者使用STL等类库 题目延伸********** ...
- Android之asset目录下文件的使用
1. 获取AssetManager AssetManager am = context.getAssets(); 2. 列出assets目录下所有文件 String[] filePathList = ...
- linu下C语言之BMP图片操作编程(下)
前面提高了一个将BMP左转的程序,右转其实也是类似的操作,就不写了,这节,我们来实现,将一张BMP图进行灰度处理,代码贴上: #include <stdio.h> #include < ...
- ServletContainerInitializer初始化器
在web容器启动时为提供给第三方组件机会做一些初始化的工作,例如注册servlet或者filtes等,servlet规范中通过ServletContainerInitializer实现此功能.每个框架 ...