我是初学者,非常欢迎替代此代码。 输入值后程序崩溃。 我也想知道更多关于这个问题,因为我已经看过很多次了。
#include<cstdio>
#include<vector>
#include<iostream>
#include<string>
using namespace std;
int main()
{
vector<string> str;
int n,i=0,count=0,a=0,b=1;
string j;
cin >> n;
while(i<n)
{
cin >> j;
str.push_back(j);
i++;
}
for(i=0;i<n;i++)
{
while(b!='\0')
{
if(str[i][a] == str[i][b])
{
count++;
}
a++;
b++;
}
}
cout << count;
return 0;
}
答案 0 :(得分:2)
以下循环永远不会结束。
while(b!='\0')
{
if(str[i][a] == str[i][b])
{
count++;
}
a++;
b++;
}
您最终会访问有效索引之外的str[i]
。
while(b!='\0')
相当于
while(b != 0)
您从b = 1
开始并继续增加它。因此,while循环中的条件将始终为真。
也许您打算使用:
while(str[i][b] != '\0')
此外,您已在a
循环后重置b
和while
的值。否则,它们将从前一个字符串的值继续,您将最终使用不正确的索引。这是解决这个问题的一种方法。在封闭的for
循环的嵌套范围内创建它们。
for(i=0;i<n;i++)
{
int a = 0;
int b = 1;
while(b!='\0')
{
if(str[i][a] == str[i][b])
{
count++;
}
a++;
b++;
}
}
答案 1 :(得分:2)
为了让你的奇怪程序工作,你应该做三件事:
在每个外部循环步骤中将初始值设置为a
和b
;
将b!='\0'
条件更改为str[i].c_str()[b]!='\0'
,以便不检查b
,而是检查字符串文字;
在你的字符串上调用string::c_str()
方法,因为不能保证字符串将以空值终止,只有c风格的字符串符合这种条件。
for(i=0;i<n;i++)
{
a = 0;
b = 1;
while(str[i].c_str()[b]!='\0')
{
if(str[i].c_str()[a] == str[i].c_str()[b])
{
count++;
}
a++;
b++;
}
}