字符串数据类型为 C++ 程序中的特定测试用例创建运行时错误

-1 c++ arrays string runtime-error c++17

对于codeforces问题:

https://codeforces.com/problemset/problem/339/A

以下程序在第七次测试中显示运行时错误:

#include<iostream>
using namespace std;

int main()
{
    char s[100];
    cin>>s;
    int i;
    string a,b,c;
    int j=0,k=0,l=0;
    for(i=0;s[i]!='\0';i++)
    {
        if(s[i]=='1')
        {
            a[j]='1';
            a[j+1]='+';
            j+=2;
        }

        if(s[i]=='2')
        {
            b[k]='2';
            b[k+1]='+';
            k+=2;
        }

        if(s[i]=='3')
        {
            c[l]='3';
            c[l+1]='+';
            l+=2;
        }
    }
    char str[100];
    int x,y,z;
    for(x=0;x<=j-1;x++)
    {
        str[x]=a[x];
    }

    for(y=0;y<=k-1;y++,x++)
    {
        str[x]=b[y];
    }

    for(z=0;z<=l-1;z++,x++)
    {
        str[x]=c[z];
    }

    int q;
    for(q=0;q<=x-2;q++)
    {
        cout<<str[q];
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

测试用例是:

2+3+3+1+2+2+2+1+1+2+1+3+2+2+3+3+2+2+3+3+3+1+1+1+3+ 3+3+2+1+3+2+3+2+1+1+3+3+3+1+2+2+1+2+2+1+2+1+3+1+1

string a,b,c;当我更改为时答案被接受char a[100],b[100],c[100];

我无法理解为什么string这里的数据类型导致运行时错误。

我猜这可能是由于测试用例的长度造成的,但我不确定为什么。

joh*_*ohn 5

给定

string a,b,c;
Run Code Online (Sandbox Code Playgroud)

ab、 和c都是零长度字符串。所以

    if(s[i]=='1')
    {
        a[j]='1';
        a[j+1]='+';
        j+=2;
    }
Run Code Online (Sandbox Code Playgroud)

是一个错误,因为j是对(零长度)字符串的越界访问a

这是一个非常常见的误解,如果您分配给字符串(或向量),它们就会增长以适应您分配给的任何索引。

正确的代码是

    if(s[i]=='1')
    {
        a.push_back('1');
        a.push_back('+');
    }
Run Code Online (Sandbox Code Playgroud)

push_back通过在末尾添加一个字符来增长字符串。

请注意,此版本的优点是您不必在单独的变量中跟踪字符串的大小。这样就可以消除变量j,从而简化代码。

for(x=0;x<a.size();x++)
{
    str[x]=a[x];
}
Run Code Online (Sandbox Code Playgroud)