2010-04-22 7 views
0

Je reçois une erreur « strcpy » et d'avertissement pour les lignes suivantes:erreur « strcpy » et avertissement

_tcscpy(strCommandLine,_T("MyProgram.exe /param1")); 

_tcscpy(strApplicationName,_T("MyProgram.exe")); 

Je ne sais pas pourquoi je reçois une erreur « strcpy » ou un avertissement depuis que je suis n'utilisant pas 'strcpy'. Les seules lignes liées à c'est:

LPCTSTR strApplicationName; 
LPTSTR strCommandLine; 
_tcscpy(strCommandLine,_T("MyProgram.exe /param1")); //warning is on this line  
_tcscpy(strApplicationName,_T("MyProgram.exe"));  //error is on this line 

La sortie est:

1>c:\documents and settings\X.X\my documents\sandbox\sample.cpp(52) : warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 

1>  c:\program files\microsoft visual studio 8\vc\include\string.h(74) : see declaration of 'strcpy' 

1>c:\documents and settings\X.X\my documents\sandbox\sample.cpp(53) : error C2664: 'strcpy' : cannot convert parameter 1 from 'LPCTSTR' to 'char *' 

1>  Conversion loses qualifiers 

Toutes les idées sur ce que cela pourrait les moyens?

Ce sont mes têtes:

iostream 
windows.h 
stdio.h 
tchar.h 
winnt.h 

Répondre

0

caractères strcpy copie jusqu'à ce qu'il frappe une terminaison nulle \0. Cela peut provoquer des dépassements de mémoire tampon et d'autres problèmes. strcpy_s copie uniquement le nombre de caractères spécifié, vous pouvez donc lui demander d'arrêter la copie avant qu'elle ne dépasse le tampon. Voir http://msdn.microsoft.com/en-us/library/td1esda9(VS.80).aspx pour plus de détails.

+1

Le 'strcpy' est caché sous des macros ou alors ici; Comme l'OP l'a mentionné, ils reçoivent l'avertissement pour quelque chose qui n'est pas «strcpy». – Joey

+0

Et je pense qu'il vaudrait mieux utiliser strncpy car c'est du C++ standard plutôt que du strcpy_s qui semble être une chose MS. –

1

LPCTSTR désigne un pointeur TCHAR const. Le premier argument de _tcscpy attend un pointeur TCHAR non const i.e LPTSTR.

Essayez quelque chose comme ceci:

TCHAR strApplicationName[2000]; 
TCHAR strCommandLine[2000[; 
_tcscpy(strCommandLine,_T("MyProgram.exe /param1")); //warning is on this line  
_tcscpy(strApplicationName,_T("MyProgram.exe")); 

PS: Même cela est très probablement incorrect. Donnez-nous plus de contexte (plus de code environnant) et nous serons en mesure de mieux vous aider.

+0

+1 Pour ne pas strcpy'ing dans les pointeurs aléatoires. Deuxièmement, la demande de plus d'informations - peut-être 'std :: string' fonctionnerait. –

1

LPCTSTR est un nom de typedef pour un pointeur sur une chaîne constante. Vous ne pouvez pas copier quoi que ce soit dans une chaîne constante. En ce qui concerne les avertissements, c'est quelque chose que le compilateur Microsoft met de son propre chef. Si vous souhaitez utiliser strcpy, désactivez l'avertissement. Le message lui-même vous indique comment le faire.

0

L'avertissement vous indique que strcpy est obsolète (évidemment _tcscpy appelle strcpy).

Le premier paramètre de _tcscpy est la chaîne de destination. Il ne peut donc pas être constant. Le 'C' dans LPCTSTR signifie const.

+0

Je ne pense pas. Le message d'avertissement indique: erreur C2664: 'strcpy': impossible de convertir le paramètre 1 de 'LPCTSTR' à 'char *' La conversion perd qualificatifs " –

+0

http://msdn.microsoft.com/en-us/library/kk6xf663 (VS.80) .aspx –

+0

Vous avez raison, vous n'avez pas vu le C4996 plus tôt. –

Questions connexes