使用字符数组的字符串输入问题c ++

时间:2019-05-20 10:13:13

标签: c++

在Codeforce 1167a上获取运行时错误 http://codeforces.com/problemset/problem/1167/A

字符串输入问题

int n;
int temp=0;
cin>>n;
//n++;

while(n--)
{
    int nn;
    cin>>nn;
    //cout<<n<<endl;

    if(nn<11)
    {
        cout<<"NO"<<endl;
        continue;
    }

    char* str = new char[nn+1];
    cin>>str;

    for(int i=0;i<=(nn-11)+1;++i)
    {
        if(str[i]=='8')
        {
            cout<<"YES"<<endl;
            temp=8;
            delete[] str;
            break;

        }




    }

    if(temp!=8)
    {
        cout<<"NO"<<endl;
    }

    temp=0;

}

输入

15 11 88888888888 100 8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888 100 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 100 1111111111111111111111111111811111111111111111111111111111111111111111111111111111111111111111111111111 100 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111181111111111111 100 111111111111111111111111111111111111111111111111111111111 ...

输出

是 是 没有 是 是 是 是 是 否

运行时错误

1 个答案:

答案 0 :(得分:0)

您正在混淆。

您可以通过两种方式来处理此问题,但是您要完成一半的工作,另一半的工作。

您可以使用动态分配

char* str = new char[nn+1];
...
delete[] str;

或者您可以使用可变长度数组(VLA)。

char str[nn+1];
...

您的代码使用VLA,但随后尝试delete就像使用动态分配一样。

在两种使用动态分配的方法中,即使某些编译器接受VLA也不是合法的C ++。

更好的C ++解决方案是使用std::string。然后分配将为您处理。