替代角色 - HackerRank

时间:2014-12-16 06:27:28

标签: c++ c++11

我是初学者,非常欢迎替代此代码。 输入值后程序崩溃。 我也想知道更多关于这个问题,因为我已经看过很多次了。

#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;
}

2 个答案:

答案 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循环后重置bwhile的值。否则,它们将从前一个字符串的值继续,您将最终使用不正确的索引。这是解决这个问题的一种方法。在封闭的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)

为了让你的奇怪程序工作,你应该做三件事: 在每个外部循环步骤中将初始值设置为ab; 将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++;
    }
}