string作为数组使用时打印超出限制的字符
std::string prints characters beyond limit when used as array
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()
之前确保没有索引越界,这是一种拐杖。
相关文章:
- 无符号字符打印其 ASCII 值
- 我正在尝试为字符打印一些相应的值,但条件总是转到其他位置
- 为什么完整的字符串没有一次打印,但是当我尝试逐个字符打印时
- 延迟逐个字符打印单词
- C++:如何将 unicode 字符打印到文本文件
- 为什么 std::hex 没有特别用字符打印为十六进制?
- 使用 C++ 将 UTF8 字符打印到 Linux 控制台
- 如何在Windows上正确地将拉丁字符打印到C++控制台
- 使用线程根据起始字符打印出单词
- 每隔n个字符打印一行换行符
- C++奇怪的字符打印到屏幕上
- 将字符打印为整数
- C++ 将文本文件的单个字符打印到屏幕
- C++递归字符打印
- 使用WritePrinter API将中文字符打印到Line Printer
- c++ Unicode字符打印
- 将UTF-32字符打印到终端
- 使用cout将数组和字符打印到屏幕时出现意外结果
- 为重复字符打印星号的算法
- 用于循环字符打印