2015-11-29 2 views
0

J'ai essayé d'écrire un programme qui copie le premier k char d'une chaîne s1, puis concatène le résultat avec le reste de la chaîne s2 à partir d'une position i puis concatène le reste de s1 le résultat. Pourtant, j'ai eu quelques problèmes avec strncpy. Il montre des caractères étranges dans la console comme @.strncpy et Strcat Garbage caractères dans C

Voici mon code:

char* strninsert(char *s1, char *s2, int k,int i) 
{ 
    int n=strlen(s1)+strlen(s2)+10; // if i put for exemple 1000 it works 
    char *result=(char*)malloc(n*sizeof(char)); 
    result[0]='\0'; 
    strncpy(result,s1,k); 
    strcat(result,(s2+i)); 
    strcat(result,(s1+k)); 
    puts(result); 
    return(result); 
} 

int main() 
{ 
    int lens; 
    printf("size string 1 "); 
    scanf("%d",&lens); 
    char *s=(char*)malloc((lens+1)*sizeof(char)); 
    getchar(); 
    fgets(s,lens+1,stdin); 

    int lenx; 
    printf("enter size string 2 "); 
    getchar(); 
    scanf("%d",&lenx); 
    char *x=(char*)malloc((lenx+1)*sizeof(char)); 
    getchar(); 
    fgets(x,lenx+1,stdin); 

    int lentemp=lenx+lens; 
    char *temp=(char*)malloc((lentemp+1)*sizeof(char)); 

    temp=strninsert(s,x,2,3); 
    puts(temp); 
    return(0); 
} 

Il me montre des personnages étranges après l'instruction strncpy comme par exemple [email protected]<line.

+4

[page man strncpy dit] (http://linux.die.net/man/3/strncpy) : "Attention: s'il n'y a pas d'octet nul parmi les n premiers octets de src, la chaîne placée dans dest n'aura pas de caractère nul". C'est-à-dire que si la valeur 'k' dans votre code est inférieure à' strlen (s1) + 1' alors le contenu résultant dans 'result' ne sera pas terminé par NUL. – kaylum

+0

Il y a beaucoup de problèmes avec ce code, tels que les fuites de mémoire, le résultat de 'malloc' (c'est une maladie), et la mauvaise mise en forme. Quel est le but des variables 'k' et' i'? Parce qu'ils sont la cause principale de ce problème. – szczurcio

+1

arrête d'utiliser 'strncpy'. Utilisez 'snprintf' à la place –

Répondre

4

strncpy man page says:

Avertissement: S'il n'y a pas octet nul parmi les n premiers octets de src, la chaîne placé dans dest ne sera pas nul terminé.

C'est, si la valeur k dans votre code est inférieure à strlen(s1)+1 alors le contenu résultant en result ne seront pas mis fin NUL. Une solution possible est de changer votre code ainsi:

/* Sanity check. */ 
if (k > strlen(s1)) { 
    k = strlen(s1); 
} 

strncpy(result , s1, k); 
result[k] = '\0'; 

En outre, pas directement lié à votre problème, mais vous avez des fuites de mémoire dans votre code.

  1. Dans la variable principale temp a reçu un tampon malloc qui est alors perdu immédiatement temp est écrasé par le résultat strninsert.
  2. Le résultat de strninsert est une mémoire dynamique qui n'est libérée nulle part.
+0

Merci beaucoup pour votre temps, cela m'a été très utile et tout a bien fonctionné. Merci beaucoup – programmer

0

Comme précédemment répondu par kaylum, le résultat de strncpy n'est pas nécessairement une chaîne. Cela pose un risque en le passant à strcat, car strcat exige que les deux arguments soient définitivement une chaîne.

La plus belle solution à votre problème, je peux penser consiste à utiliser sprintf, comme ceci:

void solution(char *destination, char *x, int x_size, char *y) { 
    sprintf(destination, "%*.s%s", x_size, x, y); 
}