2009-09-26 48 views
0
#include<iostream> 
#include<string> 
using namespace std; 
int main() 
{ 
    char arr[1000][80]; 
    char output[1000][80]; 
    int n,i,j; 
    int num[1000]; 
    cin>>n; 
    for(i=0;i<n;i++) 
    { 
    cin>>num[i]; 
     cin>>arr[i]; 
    } 
    for(i=0;i<n;i++) 
    { 
     for(j=(num[i]-1);j<(strlen(arr[i])-1);j++) 
     { 
     arr[i][j]=arr[i][j+1]; 
     } 
     arr[i][j]='\0'; 
     cout<<"\n"<<(i+1)<<" "<<arr[i]; 
    } 
    return 0; 
} 

这是在Spoj上上传时出现上述错误的代码。相同的代码在Borland C++上运行良好。运行时错误(SIGSEGV)

+0

什么是“scoj”? – bk1e 2009-09-26 16:00:10

+0

我认为这可能是一个拼写错误(http://www.spoj.pl/),在这种情况下发布挑战号码可能会很有用。仔细重读指令,例如他们说输入字符串的长度最多为80个字符。作为一个提示:我认为你可以在输入后处理和输出,不需要大数组。 – UncleBens 2009-09-26 16:29:20

+0

我认为对于代表性的代码片断来说,使用断言不会超出数组范围是非常好的! – Narek 2009-09-26 19:05:24

回答

2

根据您传递给该程序的输入,变量n可能超过1000,cin>>arr[i]可以阅读超过80个字符,如果num[i] <= 0 || num[i] >= 80那么你将指数过去四弦的一个的开始或结束。所有这些问题都存在,因为此代码使用固定大小的数组,并且不执行任何边界检查。

0

就我乍一看而言,没有什么内在错误。然而,在提供代码无法应对的输入时,段错误当然是非常有可能的。

例如,没有什么能够防止在arr的输入边界之外书写。

有没有一个具体的输入失败?

+0

我不知道spoj团队给了什么输入。在Borland C++版本5中工作正常。 – d3vdpro 2009-09-28 15:13:34

+0

对于某些输入而言,这只是很好的...为所有输入添加检查,并且它也可以正常工作。这不是编译器相关的问题 – Pieter 2009-09-28 22:47:47

0

变量n的值可能大于数组边界。这就是为什么你的代码可以给出一个超出范围的数组索引异常,因此它为什么会给出运行时错误(SIGSEGV)。