C++基础教程面向对象(学习笔记(97))

std :: string字符访问和转换为C风格的数组

Character 访问

有两种几乎相同的方式来访问字符串中的字符。更容易使用和更快的版本是重载运算符[]:

char&string :: operator [](size_type nIndex)
const char&string :: operator [](size_type nIndex)const
//这两个函数都返回索引为nIndex的字符
//传递无效索引会导致未定义的行为
//使用length()作为索引仅对const字符串有效,并返回字符串的默认构造函数生成的值。不建议您这样做。
// 因为char&是返回类型,所以可以使用它来编辑数组中的字符
//示例代码:
string sSource("abcdefg");
cout << sSource[5] << endl;
sSource[5] = 'X';
cout << sSource << endl;
//输出:

F
abcdeXg

还有一个非运营商版本。此版本较慢,因为它使用异常来检查nIndex是否有效。如果您不确定nIndex是否有效,则应使用此版本访问该数组:

char&string :: at(size_type nIndex)
const char&string :: at(size_type nIndex)const
//这两个函数都返回索引为nIndex的字符
//传递无效索引会导致out_of_range异常
//因为char&是返回类型,所以可以使用它来编辑数组中的字符
//示例代码:
string sSource("abcdefg");
cout << sSource.at(5) << endl;
sSource.at(5) = 'X';
cout << sSource << endl;
//输出:

F
abcdeXg

转换为C风格的数组

许多函数(包括所有C函数)都希望将字符串格式化为C样式字符串而不是std :: string。因此,std :: string提供了3种不同的方法将std :: string转换为C风格的字符串。

const char * string :: c_str()const
//以字符串C样式字符串形式返回字符串的内容
//附加空终止符
//C样式字符串由std :: string拥有,不应删除
//示例代码:
string sSource("abcdefg");
cout << strlen(sSource.c_str());
// 输出:

7



const char * string :: data()const
//以字符串C样式字符串形式返回字符串的内容
//不附加 空终止符
//C样式字符串由std :: string拥有,不应删除
//示例代码:
string sSource("abcdefg");
char *szString = "abcdefg";
// memcmp比较两个C风格字符串的前n个字符,如果它们相等则返回0
if (memcmp(sSource.data(), szString, sSource.length()) == 0)
    cout << "The strings are equal";
else
    cout << "The strings are not equal";
//输出:

The strings are equal



size_type string :: copy(char * szBuf,size_type nLength)const 
size_type string :: copy(char * szBuf,size_type nLength,size_type nIndex)const
//这两种风格最多将字符串的nLength字符复制到szBuf,从字符nIndex开始
//返回复制的字符数
//不附加null。由调用者决定将szBuf初始化为NULL或使用返回的长度终止字符串
//调用者负责不溢出szBuf
//示例代码:
string sSource("sphinx of black quartz, judge my vow");
 
char szBuf[20];
int nLength = sSource.copy(szBuf, 5, 10);
szBuf[nLength]='\0';  // 确保我们终止缓冲区中的字符串
 
cout << szBuf << endl;
//输出:

black

除非你需要效率,否则c_str()是三个函数中最容易和最安全的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值