29 votes

meilleur moyen de concaténer plusieurs chaînes de caractères en c ?

Existe-t-il un meilleur moyen de concaténer plusieurs chaînes de caractères en c que de faire plusieurs appels à strcat() à la suite, comme ci-dessous ?

char prefix[100] = "";
strcat(prefix, argv[0]);
strcat(prefix, ": ");
strcat(prefix, cmd_argv[0]);
strcat(prefix, ": ");
strcat(prefix, cmd_argv[1]);
perror(prefix);

29voto

Jacob Points 22306
sprintf(prefix,"%s: %s: %s",argv[0],cmd_argv[0],cmd_argv[1]);

Ou snprintf pour éviter les dépassements de tampon.

16voto

Wes Hardaker Points 10426

Snprintf serait la meilleure option et la plus facile à utiliser, bien qu'elle ne soit pas "rapide". Vous n'avez pas précisé quels étaient vos critères. La simplicité en est certainement un :

snprintf(prefix, sizeof(prefix), "%s: %s: %s", argv[0], cmd_argv[0], cmd_argv[1]);

6voto

Fred Larson Points 27404

Je risque d'avoir une mauvaise réputation pour ça, mais tant pis. La pire chose qui puisse arriver est que j'apprenne quelque chose.

Je n'utilise pas vraiment le langage C ces jours-ci, et je n'utilise généralement pas de chaînes de caractères de style C en C++. Mais une idée que j'ai eue est d'écrire un strcpy() modifié qui renvoie la fin de la chaîne :

char* my_strcpy(char*dest, const char* src)
{
    while ((*dest = *src++))
        ++dest;
    return dest;
}

Maintenant, Shlemiel peut emmener son seau avec lui :

char prefix[100] = "";
char* bucket = my_strcpy(prefix, argv[0]);
bucket = my_strcpy(bucket, ": ");
bucket = my_strcpy(bucket, cmd_argv[0]);
bucket = my_strcpy(bucket, ": ");
bucket = my_strcpy(bucket, cmd_argv[1]);
perror(prefix);

Je ne l'ai pas testé. Des commentaires ?

EDIT : Suppression de l'inutile my_strcat() fonction. Il s'avère également que c'est la même chose que stpcpy() qui fait apparemment partie de POSIX depuis 2008. Voir http://www.manpagez.com/man/3/stpcpy/ .

6voto

Alok Singhal Points 33073

J'utiliserais sprintf() comme d'autres l'ont suggéré, mais c'est pour être complet :

Si vous avez stpcpy() alors vous pouvez le faire :

char prefix[100] = "";
stpcpy(stpcpy(stpcpy(sptcpy(stpcpy(prefix, argv[0]), ": "),
        cmd_argv[0]), ": "), cmd_argv[1]);
perror(prefix);

La commodité avec stpcpy() est qu'il peut être "enchaîné", comme ci-dessus. De plus, comme stpcpy() renvoie un pointeur vers la fin de la chaîne de caractères résultante, les suivants stpcpy() les appels n'ont pas besoin de passer en revue les anciennes données encore et encore. Il est donc plus efficace que de multiples strcat() et probablement plus efficace que sprintf() . stpcpy() est POSIX:2008.

4voto

forsvarir Points 4122

Si vous essayez de construire une chaîne à partir d'autres chaînes (ce que votre exemple suggère), alors vous pouvez utiliser snprintf.

char prefix[100] = "";
snprintf( prefix, sizeof(prefix), "%s: %s: %s", argv[0], cmd_argv[0], cmd_argv[1]);

Si vous essayez de faire la concaténation d'une chaîne existante, où vous ne pouvez pas utiliser l'approche du format, alors vous êtes probablement coincé avec de multiples appels à strcat, bien que je suggère fortement que vous pourriez envisager d'utiliser strncat à la place et vérifier que vous n'avez pas de dépassement de tampon.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X