12
votes

Strcat concatez-vous un char à une ficelle?

Utilisation de GDB, je trouve que je reçois une erreur de segmentation lorsque je tente cette opération: xxx

étant donné que la chaîne est initialisée comme xxx

et actuelchar est xxx

pourquoi cela résulte-t-il d'une défaillance de segmentation?

si Strcat ne peut pas être utilisé pour cela, comment puis-je concocter un caractère sur une chaîne?


1 commentaires

Strcat nécessite des chaînes à terminaison des nuls. Votre unique Char n'a pas de null, alors Strcat continuera à copier jusqu'à ce qu'il trouve une null quelque part sur la ligne, ce qui pourrait être sur le 2e octet par accident, ou quelques gigaoctets sur la route, tout en copiant tout ce qui déchets à votre chaîne , piétinant sur la pile


7 Réponses :



2
votes

strcat () prend deux cordes terminées. Lorsque vous passez l'adresse d'un caractère, la routine examinera la mémoire qui suit le caractère, à la recherche du terminateur.

Puisque vous ne savez pas ce que cette mémoire fait même référence, vous devez vous attendre à des problèmes lorsque votre code l'accède.

En plus de cela, votre argument de chaîne n'a pas de place pour que des personnages soient annexés. Où est cette mémoire écrite? Il tentera d'écrire après la fin de la mémoire associée à cette chaîne.


0 commentaires


-1
votes

Le premier argument de Strcat doit avoir assez d'espace pour maintenir le reste de la chaîne. "" Est une chaîne constante et comme ce type de GCC n'alloit pas l'espace.

Faites-le un tableau avec suffisamment d'espace: P>

char buf[1024];

strcat(buf, "");
strcat(buf, "B");


0 commentaires

16
votes

Aussi répondu par d'autres personnes, & EM> est un pointeur sur char ou char * , mais une chaîne en C est Char [ ] ou const Char * .

Un moyen d'utiliser strcat pour concaténer un char à string crée une chaîne minimale et utilisez-le pour transformer un caractère en chaîne.

Exemple:

Fabriquer une chaîne simple, avec seulement 1 caractère et le suffixe 0 '; xxx

appliquer à votre question: xxx

ctostr assumera la chaîne "B" : xxx

et strcat fonctionnera! xxx


0 commentaires

1
votes

Je pense que la méthode la plus simple (non efficace) serait sprintf

sprintf (str, "% s% c", str, chr);


2 commentaires

Pourquoi n'est-ce pas efficace?


@ Gustavoadolfomejía parce qu'il doit analyser la chaîne de format. Vous pouvez écrire votre propre fonction (dire strctatchar () ) pour effectuer le même travail plus efficacement.



0
votes

Nous savons que CurrentChar = 'B'.

Ceci peut être fait P>

strcat(string, "B\0");


0 commentaires