从字符数组更改为字符串时出现“字符串下标超出范围”错误?
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的副本。
【讨论】:
以上是关于从字符数组更改为字符串时出现“字符串下标超出范围”错误?的主要内容,如果未能解决你的问题,请参考以下文章