2009-09-26 4 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; 
} 

Ceci est le code qui lors du téléchargement sur Spoj donne l'erreur ci-dessus. Le même code fonctionne bien sur Borland C++.erreur d'exécution (SIGSEGV)

+0

Qu'est-ce que c'est «scoj»? – bk1e

+0

Je pense que c'est peut-être une faute de frappe pour spoj (http://www.spoj.pl/), auquel cas il pourrait être utile de poster le numéro de défi. Relisez attentivement l'instruction, par exemple, ils disent que la longueur de la chaîne d'entrée sera d'au plus 80 caractères. Comme un indice: je pense que vous pouvez traiter et sortir juste après l'entrée, pas besoin d'un grand tableau. – UncleBens

+0

Je pense que pour l'extrait de code représenté, il serait très bon d'utiliser des assertions pour ne pas sortir de la plage de tableaux! – Narek

Répondre

2

En fonction de l'entrée que vous passez à ce programme, la n variable peut être plus de 1000, cin>>arr[i] peut lire plus de 80 caractères, et si num[i] <= 0 || num[i] >= 80 vous indexera après le début ou la fin d'un de vos cordes. Tous ces problèmes existent car ce code utilise des tableaux de taille fixe et ne vérifie pas les limites.

0

De mon point de vue, il n'y a rien de fondamentalement faux. Cependant, une erreur de segmentation est certainement très possible lors de la fourniture d'entrées que votre code ne peut pas gérer.

Rien n'empêche d'écrire en dehors des limites de arr en entrée par exemple.

Y a-t-il une entrée spécifique pour laquelle cela échoue?

+0

Je ne sais pas ce que l'équipe spoj donne. En borland C++ version 5 fonctionne très bien. – d3vdpro

+0

C'est bien pour certaines entrées ... ajoutez des contrôles pour toutes vos entrées et ça marchera bien aussi. ce n'est pas un problème lié au compilateur – Pieter

0

La valeur de la variable n peut être supérieure aux limites du tableau. C'est pourquoi votre code peut donner une exception hors-limite d'index de tableau, et par conséquent pourquoi il donne une erreur d'exécution (SIGSEGV).