Concaténation de char* avec Visual studio

Fermé
AppareilARaclette300W - 6 juin 2017 à 19:42
 AppareilARaclette300W - 7 juin 2017 à 12:53
Bonjour,
Dans le cadre d'un projet scolaire, j'ai besoin de coder une fonction dans laquelle je rentre une chaîne de caractères, qui la concatène avec une chaîne en dur et qui me retourne le tout.

par exemple dans mon cas je manipule des url avec Curl , je stocke des url à qui il manque le http://nomdedomaine.fr/ devant.

j'ai donc une liste de pages stockées mais ce ne sont que les id des pages, je voudrais reconstituer les url pour les exploiter avec Curl,

j'aimerais faire une fonction de type char * (qui du coup me retourne un char*).

Par exemple j'aurais un id de page ex: "014ABC" et je voudrais que ma fonction me retourne "http://nomdedomaine.fr/014ABC"

Le problème c'est que je dois absolument utiliser Visual Studio 2015. quand je lui écris du strcat avec seulement deux paramètres, il n'est pas content, il veut absolument que je lui donne du strcat_s avec 3 paramètres.


char* concat(char *article)
{
	 char *domaine = "http://nomdedomaine.fr/";
	char *result = malloc(strlen(domaine) + strlen(article)+1 );

													   
	strcpy_s(result, strlen(domaine), domaine);
	strcat_s(result, strlen(article),article);
	return result;
}


c'est la première fois que j'ai besoin de faire ça en C, je suis très ennuyé car la compilation fonctionne et ensuite quand le programme se lance ça donne pleins d'erreurs de violation de mémoire, je comprends pas pourquoi (enfin je ne vois pas à quel endroit ça plante), de plus je ne sais pas quand et comment je suis supposé free le tableau de char result que j'ai malloc au début de la fonction.

je ne trouve pas de solution pour le faire proprement dans Visual Studio, je ne trouve que des codes exemple qui le font avec les "vraies" fonction "originales" du C, et pas celles modifiées par Microsoft. D'ailleurs la doc Microsoft et mes cours de C ne m'aident pas plus, c'est un peu la galère, j'ai passé plusieurs jours sans trouver.

Bonne soirée, merci d'avance à ceux qui prendront le temps de m'aider ! :)
A voir également:

2 réponses

Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
6 juin 2017 à 23:21
Bonjour,
Le paramètre de taille attend la taille du buffer, il permet de vérifier que l'on ne met pas plus de caractères que le max.
char* concat( char const *article ) {
	static char const domaine[] = "http://nomdedomaine.fr/";
	unsigned lgm = sizeof domaine  +  strlen( article );
	char *result = malloc( lg );
						   
	strcpy_s( result , lgm , domaine );
	strcat_s( result , lgm , article );
	return result;
}
1
AppareilARaclette300W
7 juin 2017 à 12:50
super merci beaucoup j'ai bien compris comment ça marche maintenant !
merci beaucoup pour le temps que vous avez passé à me répondre, ça marche nickel ! :)
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
Modifié le 7 juin 2017 à 11:40
Salut,

de plus je ne sais pas quand et comment je suis supposé free le tableau de char result que j'ai malloc au début de la fonction.

idéalement, la fonction qui appelle concat devrait libérer la mémoire une fois qu'elle ne sert plus

je ne trouve pas de solution pour le faire proprement dans Visual Studio, je ne trouve que des codes exemple qui le font avec les "vraies" fonction "originales" du C, et pas celles modifiées par Microsoft.

C'est du C11 standard, https://en.cppreference.com/w/c/string/byte/strcat.

D'ailleurs la doc Microsoft et mes cours de C ne m'aident pas plus, c'est un peu la galère, j'ai passé plusieurs jours sans trouver.

La doc Microsoft est là : https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/strcat-s-wcscat-s-mbscat-s?redirectedfrom=MSDN&view=msvc-160&viewFallbackFrom=vs-2019

Avec un compilateur supportant ces fonctions, cela a du sens aussi d'utiliser strlen_s() https://en.cppreference.com/w/c/string/byte/strlen

et... de vérifier les valeurs de retour de toutes ces fonctions, pour que cela serve à quelque chose de les utiliser ;-)

Note aussi que selon le standard C11, il faut définir __STDC_WANT_LIB_EXT1__ 1 avant d'inclure string.h pour accéder à ces fonctions et qu'elle ne sont accessibles sur un compilateur donné que si celui-ci définit alors __STDC_LIB_EXT1__.

#define __STDC_WANT_LIB_EXT1__ 1
#include <string.h>

(...)

#ifdef __STDC_LIB_EXT1__
    /* utiliser strcpy_s, strcat_s, strlen_s */
#else
    /* non supportées sur ce compilateur */
#endif


Dal
1
AppareilARaclette300W
7 juin 2017 à 12:53
Ah yes je comprends mieux grâce à ta réponse ! :)
je ne suis pas un pro de VS et le C n'est pas le langage dont j'ai l'habitude !

Merci pour les infos que tu m'as apporté et le temps que tu as passé à me répondre, ça m'a beaucoup aidé ! :)
0