-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这里的数据类型导致运行时错误。
我猜这可能是由于测试用例的长度造成的,但我不确定为什么。
给定
string a,b,c;
Run Code Online (Sandbox Code Playgroud)
a、b、 和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)