2009-09-26 99 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)。