Différence de stricmp et _stricmp dans Visual Studio?
Je peut poser une question stupide, mais je ne peux vraiment pas trouver une réponse avec google plus je suis encore un débutant d'utiliser MSVS.
Récemment, j'ai besoin d'utiliser des fonctions pour faire la comparaison de deux chaînes de caractères. Ce que je ne comprends pas, c'est la différence de stricmp et _stricmp. Ils ont tous deux peuvent être utilisés pour comparer des chaînes de caractères et les mêmes résultats. Je suis allé vérifier:
char string1[] = "The quick brown dog jumps over the lazy fox";
char string2[] = "The QUICK brown dog jumps over the lazy fox";
void main( void )
{
char tmp[20];
int result;
/* Case sensitive */
printf( "Compare strings:\n\t%s\n\t%s\n\n", string1, string2 );
result = stricmp( string1, string2 );
if( result > 0 )
strcpy( tmp, "greater than" );
else if( result < 0 )
strcpy( tmp, "less than" );
else
strcpy( tmp, "equal to" );
printf( "\tstricmp: String 1 is %s string 2\n", tmp );
/* Case insensitive */
result = _stricmp( string1, string2 );
if( result > 0 )
strcpy( tmp, "greater than" );
else if( result < 0 )
strcpy( tmp, "less than" );
else
strcpy( tmp, "equal to" );
printf( "\t_stricmp: String 1 is %s string 2\n", tmp );
}
résultat montre qu'ils sont les mêmes:
Compare strings:
The quick brown dog jumps over the lazy fox
The QUICK brown dog jumps over the lazy fox
stricmp: String 1 is equal to string 2
_stricmp: String 1 is equal to string 2
Je me demande pourquoi...
OriginalL'auteur FortCpp | 2012-09-13
Vous devez vous connecter pour publier un commentaire.
stricmp
est une fonction POSIX, et non une norme C90 fonction. Pour éviter les collisions de noms Microsoft obsolète la non-conformité nom (stricmp
) et recommande l'utilisation de_stricmp
à la place. Il n'y a pas de différence dans les fonctionnalités (stricmp
est simplement un alias pour_stricmp
.)Grâce StarPilot. Je vais utiliser _stricmp dans mon projet. Et d'autres fonctions fonctionnent de la même manière?
stricmp
est pas une fonction POSIX, c'est une fonction Win32. POSIX définitstrcasecmp
à la place.Microsoft indique qu'ils sont les fonctions POSIX dans leur documentation. Par exemple, voir: msdn.microsoft.com/en-us/library/ms235365(v=vs. 80).aspx
OriginalL'auteur StarPilot
Pour de nombreuses fonctions de la bibliothèque, y compris tous les
<string.h>
fonctions, le trait de soulignement préfixé versions sont/étaient de Microsoft à l'idée de quelque chose. Je ne me souviens pas exactement quoi.La non-souligné version est très portable. Code qui utilise
_stricmp()
,_strcpy()
, etc. doit être traitée d'une certaine manière—edit,#defined
, etc.—si le code doit être traité par un autre compilateur.stricmp
ni_stricmp
fait partie de la norme C et C++; techniquement,stricmp
pas l'un des<string.h>
fonctions. Mais c'est un très commun de l'extension.Oui, bien que certaines bibliothèques ont
strcmpi()
oustrcasecmp()
à la place.Merci de votre réponse wallyk. Je pense que c'est peut-être très utile pour rendre le code portable en utilisant la fonction "stricmp" (pas
_stricmp
). Depuis que je suis à la recherche pour le remplacement de la fonctionstrcasecmp()
etstrncasecmp()
. Ma compréhension jusqu'à présent, est que l'on peut utiliser(_)stricmp
et(_)strnicmp
comme des remplacements.OriginalL'auteur wallyk