Regardons ces lignes:
new_str[0] = '\0';
strcat(new_str,firstP);
new_str[strlen(firstP)] = '/';
strcat(new_str,secondP);
Avant d'écrire quoi que ce soit, la chaîne ressemble à ceci:
+---+---+---+---+---+---+---+---+
| ? | ? | ? | ? | ? | ? | ? | ? |
+---+---+---+---+---+---+---+---+
Après la première ligne (new_str[0] = '\0';
), vous avez ceci:
+---+---+---+---+---+---+---+---+
| 0 | ? | ? | ? | ? | ? | ? | ? |
+---+---+---+---+---+---+---+---+
Après la deuxième ligne (strcat(new_str,firstP);
), il ressemble à ceci:
+---+---+---+---+---+---+---+---+
| A | B | C | D | 0 | ? | ? | ? |
+---+---+---+---+---+---+---+---+
Maintenant, lorsque vous exécuter la ligne
new_str[strlen(firstP)] = '/';
vous écrasez le terminateur null et obtenez ceci:
+---+---+---+---+---+---+---+---+
| A | B | C | D |/| ? | ? | ? |
+---+---+---+---+---+---+---+---+
Ceci est un problème, parce que votre chaîne est plus nul fin, donc lors du prochain appel strcat
le programme va commencer à lire dans la chasse de mémoire non initialisée autour de un terminateur null.
Si vous voulez concaténer les chaînes ensemble, il pourrait être plus facile à utiliser simplement sprintf
, comme ceci:
sprintf(new_str, "%s/%s", firstP, secondP);
Cette plus dit explicitement « écrire la première chaîne, puis le séparateur, puis la deuxième chaîne "et décharge toute la gestion de terminaison nulle dans la bibliothèque. Et les bibliothèques, à l'exception de strncat
, traitent généralement bien les terminaisons NULL. :-)
Il est également possible que le sprintf
soit légèrement plus rapide que ce que vous êtes en train de faire. En utilisant beaucoup de strcat
s dans une rangée de la manière que vous proposez peut être inefficace en raison du overhead of rescanning the strings to find the null terminators, mais je ne parierais pas dessus. Il a, cependant, l'avantage très clair de communiquer plus précisément ce que vous essayez de faire, et les gains de lisibilité sont rarement une mauvaise chose.
'sprintf (new_str,"% s /% s ", premierP, secondP);' au lieu de. 'new_str [strlen (firstP)] = '/';' écrase le dernier null-terminator de la chaîne. Donc le 2ème 'strcat' ne trouve pas la fin de la chaîne correcte. – BLUEPIXY
Il y a beaucoup mieux de faire cela ... fonction strcat. Voir: https://www.tutorialspoint.com/c_standard_library/c_function_strcat.htm ou suggestion @BLUEPIXY aussi :) –
@BLUEPIXY J'ai tout enlevé de l'if-statement et l'ai remplacé par sprintf (new_str, "% s /% s" , premierP, deuxièmeP); ça fonctionne maintenant parfaitement. Merci :) – Cows42