string作为数组使用时打印超出限制的字符

std::string prints characters beyond limit when used as array

本文关键字:字符 打印 数组 string      更新时间:2023-10-16

Programming: Practices and Principles - Bjarne Stroustrup

在第5章钻孔-错误

string s = "Success!n";
for(int i=0;i<100;++i)
    cout<<s[i];

在打印成功后打印随机字符,中间有几个空格!超出实际字符串限制。为什么呢?为什么不抛出out_of_bounds异常?

与Java和类似的语言不同,标准没有规定当数组索引超出其定义的边界时应该抛出异常。这样做会导致未定义的行为。不检查索引是否在数组的边界内有助于快速索引,但这意味着你必须做一些额外的记录。

幸运的是,std::string通过存储字符数组的大小为您做了这个簿记。如果您需要在运行时使用边界检查,请使用std::string::at()

编辑:正如评论中所说,如果你使用at()只是为了捕捉抛出的异常,这几乎总是一个bug。异常应该用于使应用程序处于异常状态的问题。在编写代码时,您应该牢记永远不会发生索引越界的情况。最好在将索引传递给string::operator[]而不是使用string::at()之前确保没有索引越界,这是一种拐杖。