行。所以我正在制作一个简单的程序来试验字符串,在程序的一部分中,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>
已包含在内,我只是在向您展示时遇到问题
网站。遗憾!
答案 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;,你的实际权限是:
意味着在这种情况下字符串[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]
。