访问C ++空字符串中的任何位置

时间:2015-07-01 15:52:03

标签: c++ string

为什么可以在任何位置访问C ++空字符串而不会出错?

例如,

string str(""); 

str[1]str[2]将返回空。

为什么以下语句没有抛出错误?

str[2] = 'a'

但是,打印出str仍显示空字符串。

我在这里很困惑,可能会错过一些东西。

4 个答案:

答案 0 :(得分:4)

未定义访问超出范围的下标。对于空std::string,使用任何下标都是非法的。

但是,库不需要检查下标的值。确保下标合法的工作留给程序员,即你。

答案 1 :(得分:3)

这个字符串是(一种)你可以粘贴的字符数组。当你制作它时,""它保证长度至少 0个字符可用。当你为角色[2]分配一些东西时,行为是不确定的,并且它有权被炸毁,但是它很有可能在不注意的情况下吸收你的错误...

答案 2 :(得分:2)

可以使用std::string运算符并使用[]函数访问

at()个元素。运算符不需要执行边界检查,就像在C ++中使用常规数组访问一样,而函数会为无效索引抛出out_of_range

答案 3 :(得分:2)

除了Yu和Andy的回答,当然这是正确的,我想指出string::atstring::operator[]不像#include <string> int main() { std::string s(""); return s.at(1); } 那样会检查并通过异常进行检查尝试越界访问:

terminate called after throwing an instance of 'std::out_of_range'
  what():  basic_string::at
Aborted (core dumped)

输出:

SELECT
    DerivedAllLRS_IDs.LRS_ID,
    COALESCE([Table 1].AGENCY_ID, [Table 2].AGENCY_ID) AS AGENCY_ID,
    COALESCE([Table 1].LOCAL_ID, [Table 2].LOCAL_ID) AS LOCAL_ID,
    COALESCE([Table 1].CLASS, [Table 2].CLASS) AS CLASS
FROM
    (
    SELECT DISTINCT 
        LRS_ID
    FROM
        (
        (SELECT LRS_ID FROM [Table 1])
        UNION ALL
        (SELECT LRS_ID FROM [Table 2])
        )DerivedUnion
    ) DerivedAllLRS_IDs
    LEFT OUTER JOIN [Table 1] ON DerivedAllLRS_IDs.LRS_ID = [Table 1].LRS_ID
    LEFT OUTER JOIN [Table 2] ON DerivedAllLRS_IDs.LRS_ID = [Table 2].LRS_ID