Strcpy et strcpy_s

lektrosonic Messages postés 145 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 21 février 2013 - 11 mars 2007 à 21:09
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 - 13 mars 2007 à 19:24
bonjour, j'ai ramene mon projet sous visual studio 2005 pro (de dev-cpp)
sous dev-cpp j utilisait strcpy..aucun probleme..
alors que la premiere fois que j'ai compile sous vs, un warning aparait comme quoi strcpy n est pas tres sur et que je doi utiliser strycpy_s

je le remplace avec strycpy_s (qui prend un argument de plus, celui de la taille maximale de la chaine de destination)
j ecrit alors:
strcpy_s(lang[i],sizeof(lang[i]),temp_buffer);

et bam ca plante lors de cette..(pas d erreur de compilation, ca plante quand j execute l exe)
une suggestion peut etre?
doi-je juste laisser strcpy et ignorer le warning ?

13 réponses

racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
12 mars 2007 à 01:01
Salut,
Tu peux bien sûr ignorer le warning. Personnellement, je préfère utiliser la fonction API lstrcpy(). Pour un nombre déterminé de caractères il y'a lstrcpyn().
0
cs_louis14 Messages postés 793 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 10 février 2021 8
12 mars 2007 à 08:52
j'ai eu le même problème, vérifie bien la taille maximale de la chaine de destination, pense au zero terminal.

louis14
0
lektrosonic Messages postés 145 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 21 février 2013
12 mars 2007 à 11:01
c est a dire, je doi mettre
strcpy_s(lang[i],sizeof(lang[i]+1),temp_buffer); ?
0
cs_louis14 Messages postés 793 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 10 février 2021 8
12 mars 2007 à 12:45
non surtout pas  mais -1 pour laisser de la place au zéro terminal. j'avais une exception de ce type et en applicant cette démarche je n'en ai plus.

louis14
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_louis14 Messages postés 793 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 10 février 2021 8
12 mars 2007 à 12:46
la taille de lang doit être choisie de façon à ne pas avoir de troncature.

louis14
0
lektrosonic Messages postés 145 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 21 février 2013
12 mars 2007 à 19:07
-1 je le met dans le sizeof ou apres?
(sizeof(lang[i])-1) ou (sizeof(lang[i]-1) ?
0
lektrosonic Messages postés 145 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 21 février 2013
12 mars 2007 à 23:27
ceci est mon code:

char* lang[50];

for(i=1;i<51;i++)
{
wsprintf(temp_str,"%ld",i);
length=GetPrivateProfileString("hydrid_tool_language",temp_str,"",temp_buffer,MAX_PATH,lngfile);
lang[i]=NULL;
lang[i]=malloc(sizeof(char)*(length+1));
if(lang[i]==NULL)
{
error(9,hwnd_loading);
}
strcpy(lang[i],temp_buffer);
}


Pouvait vous me dire svp comment je vai ecrire strcpy_s qui remplacera strcpy..merci
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
13 mars 2007 à 04:21
wsprintf, c'est pas pour du UNICODE ça ?

De plus, peut-être est-ce voulu mais, tu commence ton tableau à 1. Normalement c'est à 0 donc: for(i=0;i<51;++i)

char *lang[50] <- c'est un tableau de pointeurs.
Si tu fais sizeof(lang[i]), tu obtiendra à tout les coups 4, car c'est la taille d'un pointeur.

Moi, à ta place, je choisirais d'ignorer l'avertissement. Si tout est bien codé, il n'y a aucune raison d'utiliser strcpy_s (en plus, c'est plus lourd qu'un strcpy).

Il existe un emplacement dans les propriétés de ton projet pour désactiver les avertissements. Suffis d'entrer le numéro de l'avertissement pour qu'il n'apparaise plus. Je ne peux pas te dire exactement où car je suis sous Linux actuellement mais je crois que c'est dans l'onglet compilateur.

C++ (@++)
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
13 mars 2007 à 04:28
Oups pardons. Petite erreur:

for(i=0;i<50;++i)
D'ailleur, c'est applicable aussi si tu commence à 1 sinon, tu te trouve à lire en dehors du buffer:
for(i=1;i<50;++i)

C++ (@++)
0
cs_louis14 Messages postés 793 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 10 février 2021 8
13 mars 2007 à 08:39
#define LENGTH_STR 50
char* lang;
for(i=0;i<LENGTH_STR;i++)

   wsprintf(temp_str,"%ld",i);
    length=GetPrivateProfileString"hydrid_tool_language",temp_str,"",temp_buffer,MAX_PATH,lngfile);    
   lang=NULL;
   lang =malloc(sizeof(char)*(LENGTH_STR +1));
 if(lang[i]==NULL)
{
error(9,hwnd_loading);
 }
strcpy(lang,LENGTH_STR,temp_buffer); }

Je pense que cela devrait convenir, je ne vois pas l'intérêt du tableau de pointeurs de char.

louis14
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
13 mars 2007 à 15:56
louis >> Je ne vois pas l'interet de ton code. Tu écrase à chaque tour de boucle la chaine précédament entrée dans lang. Ça ne sers à rien. Y'a aussi quelques petits trucs d'inutiles:

lang = NULL; <- Pas nécessaire

if(lang[i] == NULL) <- C'est quoi ça ??? Pour tester la mémoire alloué par malloc, on fait : if(!lang)

strcpy(lang,LENGTH_STR,temp_buffer) <- C'est un strcpy, pas de LENGTH_STR

_______________________
Voici quelque chose d'autre:



#define LENGTH_STR 50
char* lang[50], temp_str[10], temp_buffer[MAX_PATH];
int i, length;
for(i=0;i<50;++i)

    _itoa(i, temp_str, 10);
    length=GetPrivateProfileString("hydrid_tool_language",temp_str,0,temp_buffer,MAX_PATH,lngfile);   
    if(!(lang[i] = malloc(sizeof(char)*(length+1)))) return 0;
    strcpy(lang[i],temp_buffer);
}

Sinon, on peut bien se passer du strcpy. Plus rapide mais on "gaspille" la mémoire:



#define LENGTH_STR 51

char* lang[50], temp_str[10];

int i;

for(i=0;i<50;i++)



    _itoa(i, tmp_str, 10);
    if(!(lang[i] = malloc(sizeof(char)*(LENGTH_STR)))) return 0;
GetPrivateProfileString("hydrid_tool_language",temp_str,0,lang[i],LENGTH_STR,lngfile);   

}

J'ai pas testé le code, car je suis sous Linux mais ça devrais être ça.
C++ (@++)
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
13 mars 2007 à 15:59
Oups
_itoa(i, temp_str, 10); dans mon second code et non _itoa(i, tmp_str, 10);

C++ (@++)
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
13 mars 2007 à 19:24
D'ailleur, on peut aussi se passer du malloc dans mon second code:

#define LENGTH_STR 51
char* lang[50][LENGTH_STR], temp_str[10];
int i;
for(i=0;i<50;i++)

    _itoa(i, temp_str, 10);
GetPrivateProfileString("hydrid_tool_language",temp_str,0,lang[i],LENGTH_STR,lngfile);   
}

P.S. Le  #define LENGTH_STR 50 est inutile dans mon premier code.

C++ (@++)
0
Rejoignez-nous