调试断言失败! (字符串下标超出范围)

时间:2014-07-01 01:58:14

标签: c++ visual-studio-2010 debugging

行。所以我正在制作一个简单的程序来试验字符串,在程序的一部分中,for循环按顺序显示字符串的每个字母。我正常运行该程序以检查其在整个编码过程中的进度,但是当我将其放入时,发生了错误。这是我的代码:

int main()
{
std::string word1 = "Chicken";
std::string word2("Nuggets");
std::string word3(3, '!');

std::string phrase = word1 + " " + word2 + word3;

std::cout << "The phrase is: " << phrase << "\n\n";

std::cout << "This phrase has " << phrase.size() << " letters!" << "\n\n";

std::cout << "The character at position zero is " << phrase[0] << "\n\n";

phrase[0] = 'S';

std::cout << "The phrase is now... " << phrase << "\n\n";

for (unsigned int i = 0; i <= phrase.size(); ++i)
{
    std::cout << "Position " << i << "'s character is " << phrase[i] << "\n";
}

}

任何帮助都会非常感激,对我的代码的反馈也是如此(因为我是新手)。

P.S。 <iostream><string>已包含在内,我只是在向您展示时遇到问题 网站。遗憾!

3 个答案:

答案 0 :(得分:1)

正如其他人所提到的,如果您使用C ++ 03进行编译,则会导致未定义的行为,因为索引值不能大于或等于字符串大小。

operator[]与C ++ 11一起使用时i == phrase.size()实际上是有效的,并且会产生一个空字符(尽管这个字符只能被读取而不能被修改)。

http://en.cppreference.com/w/cpp/string/basic_string/operator_at

答案 1 :(得分:0)

for (unsigned int i = 0; i <= phrase.size(); ++i)

你在0到phrase.size()之间,包括在内,这太长了。你应该去phrase.size() - 1。要么将其更改为,要么将<=更改为<,您应该没问题。

示例修复1:

for (unsigned int i = 0; i < phrase.size(); i++)

示例修复2:

for (unsigned int i = 0; i <= phrase.size() - 1; i++)

编辑 - 更长/更详细的说明: 因为如果你有一个包含5个字母的字符串:&#34;你好&#34;,你的实际权限是:

  • string [0] =&#39; H&#39;
  • string [1] =&#39; e&#39;
  • string [2] =&#39; l&#39;
  • string [3] =&#39; l&#39;
  • string [4] =&#39; o&#39;

意味着在这种情况下字符串[5]太过分了。由于您使用的是基于0的索引(与大多数编程语言一样),您必须从0到大小为1

答案 2 :(得分:0)

字符串索引计为从零开始的索引,但它的长度仍然是一个。

如果您的字符串s包含字符&#34; 12345&#34; std::string::size()将返回5,但s [5]不是有效字符,因为有效索引为s[0]s[1]s[2]s[3],{{ 1}}。

您的for循环应为s[4]