当用作数组时,std :: string会打印超出限制的字符

时间:2015-07-12 07:48:15

标签: c++

编程:实践与原则 - Bjarne Stroustrup

钻进第5章 - 错误

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

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

1 个答案:

答案 0 :(得分:5)

与Java和类似语言不同,该标准并未规定当数组在其定义的边界之外编入索引时应抛出异常。这样做会导致undefined behavior。不检查索引是否在数组的范围内,可以快速建立索引,但这意味着你必须做一些额外的簿记。

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

编辑:如评论中所述,如果您使用at()来捕获抛出的异常,则几乎总是一个错误。应将异常用于使应用程序处于异常状态的问题。你应该用思维模式编写代码,使得索引越界不应该发生。在将它们传递给string::operator[]而不是使用string::at()之前,最好确保没有任何索引超出范围,这是一种拐杖。