从字符数组更改为字符串时出现“字符串下标超出范围”错误?

Posted

技术标签:

【中文标题】从字符数组更改为字符串时出现“字符串下标超出范围”错误?【英文标题】:"String subscript out of range" error when changing from character array to string? 【发布时间】:2013-02-27 01:47:10 【问题描述】:

我开始使用字符串代替字符数组,当我将定义为大小为 5 的字符数组之一更改为字符串时遇到错误。尝试运行程序时,我得到的错误是“表达式:字符串下标超出范围”。

"newWord" 最初是一个字符数组,但在将其更改为字符串后,我收到了这个错误。我不明白是什么原因造成的,当使用字符数组时程序运行良好。

int main() 
fstream inputFile;
fstream outputFile;
string newWord;
int i, k;
string word;
inputFile.open( "H:\\word.txt" );
outputFile.open( "H:\\newword.txt" );
if( inputFile )

    while( getline( inputFile, word ) )
    
        for( i = 0; i < (word.length()- 3); ++i )
        
            for( k = 0; k < 4; ++k )
                newWord[k] = word[i+k];
            cout << newWord << endl;
            outputFile << newWord << endl;
        
    

return 0;

【问题讨论】:

您的帖子缺少两件事:int main() 和一个问题。您能否将您的具体问题添加到您的帖子中,并提供SSCCE? 对不起,我只包含了函数内部的内容。 1.请注意,std::string 具有子字符串功能。你可以用它来真正简化最里面的逻辑。 2.另请注意,(word.lengt()-3 执行 无符号算术,这意味着您永远不会得到否定结果。现在你可以应用一个解决方法,比如int(word.length())-3。稍后考虑定义一个通用的有符号整数size 函数。 3. if( inputFile ) 检查是不必要的,因为在错误模式下,getline 只会在第一次失败。 【参考方案1】:
newWord[k]

newWord 字符串的大小为零。未定义超出std::string 末尾的索引行为。

您可能需要调整字符串的大小,因此:

newWord.resize(5);

【讨论】:

【参考方案2】:

错误是因为newWord[k] = word[i+k]; 没有为newWord 中的字符串分配空间。字符串长度为 0,这样做是未定义的行为。请改用 .append。

来自cplusplus.com:

如果 pos 不大于字符串长度,则函数永远不会 抛出异常(不抛出保证)。否则,它会导致未定义 行为。

对于newWord[k],pos是k。

这很容易通过使用字符串库中的 append 函数来避免。

来自cplusplus.com,再次:

字符串&追加(常量字符串& str); //追加一个str的副本。

【讨论】:

以上是关于从字符数组更改为字符串时出现“字符串下标超出范围”错误?的主要内容,如果未能解决你的问题,请参考以下文章

问题:“字符串下标超出范围”C++

视觉 C++ 字符串下标超出范围

我收到“字符串下标超出范围错误”。我不知道为啥

C++检查和修改字符串/字符串下标超出范围

访问 std::string 中的空终止字符(字符串下标超出范围)

字符串下标超出范围,使用散列 ADT