2014-05-14 4 views
0

J'essaye this problème de spoj. Mais je ne pourrais pas obtenir pourquoi il donne la faute de segmentation dans quelque cas de test.Pourquoi une erreur de segmentation?

#include <iostream> 
#include <cstring> 
#include <stdio.h> 
using namespace std; 
int getMin(char *txt,int n) { 
    int min = 0; 
    for(int i = 0 ; i < n ; i++) { 
     if(strcmp(txt+min ,txt+i) > 0) 
      min = i; 
    } 
    return min; 
} 
int main() { 

    char *s = new char[200005]; 
    scanf("%s",s); 
    int n = strlen(s); 
    strcat(s+n,s); 
    printf("\n%d",getMin(s,n)); 
    delete[] s; 
return 0;  
} 

Répondre

0

De la page de manuel de strcat: "Les chaînes ne peuvent pas (source et destination) se chevauchent".

Alors, qu'est-ce qui ne va pas? Eh bien s + n est l'octet nul de terminaison de la chaîne s. Ce faisant quelque chose comme ceci:

char *strcat(char *dest, const char *src) 
{ 
     while (*dest != '0') 
       dest++; 
     while (*src != '\0') 
       *dest++ = *src++; 
     return dest; 
} 

ne trouvera pas un octet nul dans src, parce qu'il a été écrit sur le temps que nous y arriverons, parce que c'est l'adresse que vous avez passé comme chaîne de destimation. Et ainsi, votre fonction strcat continue jusqu'à ce qu'il y ait une violation d'accès et que votre programme sème des erreurs.

Questions connexes