2017-03-04 8 views
-3

Je veux écrire un programme qui obtient la première moitié d'une chaîne 'ch1' et la place dans une chaîne 'ch3' puis obtient la première moitié d'une autre chaîne 'ch2' et la concatène dans «ch3 "met est en fin de ch3" mais quand je l'exécute, il me donne une sortie bizarre .. ch3 par exemple:sortie bizarre utilisant strncpy et strncat

ch1 ="123" 
ch2 ="azertyuiop" 

le résultat: ch3 =" 1 < 3rdweirdletter> azert "

Ceci est mon code:

int main() 
{ 
char ch1[200],ch2[200],ch3[200]; 

puts("give 'ch1' "); 
gets(ch1); 
puts("give 'ch2' "); 
gets(ch2); 

strncpy(ch3,ch1, strlen(ch1)/2); 
strncat(ch3,ch2, strlen(ch2)/2); 

printf("a half \"%s\" + a half \"%s\" gives \"%s\"",ch1,ch2,ch3); 

return 0; 
} 

J'apprécierais que quelqu'un m'aide. Merci

+2

'man 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 ne sera pas terminée par un zéro. * – EOF

+0

pourriez-vous expliquer une Un peu plus .. Désolé, je suis nouveau à ce –

+2

Ne pas utiliser 'gets': http://stackoverflow.com/q/1694036/4996248 –

Répondre

1

Vous pouvez initialiser ch3[] être des zéros: char ch3[200] = { 0 }; Ou vous pouvez placer manuellement le nul de terminaison (le caractère '\0') sur ch3 après avoir copié la première moitié de ch1 à elle:

strncpy(ch3, ch1, strlen(ch1)/2); 
ch3[strlen(ch1)/2] = '\0'; 
strncat(ch3, ch2, strlen(ch2)/2); 

Ceci est nécessaire car les chaînes dans C doivent être terminées par un caractère nul (ce qui signifie que vous avez besoin d'une valeur de 0 après le dernier caractère de la chaîne pour marquer la fin de la chaîne). La fonction strncpy(s, ct, n) seulement avec des zéros si ct a moins de caractères que n (pas votre cas), par conséquent, si vous n'ajoutez pas le caractère nul manuellement, strncat va penser que ch3 est beaucoup plus long. Il cherchera le premier zéro dans la mémoire après le début de ch3 et seulement là il concaténera ce que vous vouliez. C'est de là que viennent ces personnages étranges.