2012-03-22 4 views
0

Je vais avoir un problème avec la comparaison 2 chaînes char qui sont à la fois le même:numéro de chaîne strncpy char lors de l'ajout longueur

char string[50]; 

strncpy(string, "StringToCompare", 49); 

if(!strcmp("StringToCompare", string)) 
//do stuff 
else 
//the code runs into here even tho both strings are the same...this is what the problem is. 

Si j'utilise:

strcpy(string, "StringToCompare");

au lieu de:

strncpy(string, "StringToCompare", 49);

il résout le problème, mais je préfère insérer la longueur de la chaîne plutôt que de l'obtenir elle-même.

Qu'est-ce qui ne va pas ici? Comment puis-je résoudre ce problème?

+2

incorrect est que vous utilisez des chaînes c, au lieu de std :: string –

+0

Vous devez ajoutez la fin de la chaîne '\ 0' car vous déclarez "chaîne" comme un vecteur de caractères, et non comme une chaîne. – Cristy

+1

Est-ce que la chaîne du "monde réel" comporte 49 caractères par hasard? –

Répondre

2

Vous avez oublié de mettre un caractère NUL de terminaison à string, alors peut-être que strcmp est exécuté à la fin. Utilisez cette ligne de code:

string[49] = '\0'; 

pour résoudre votre problème.

+0

Cela pourrait être le problème dans son exemple réel, mais pas dans son cas de test publié. À partir de la page man Linux: "Si la longueur de' src' est inférieure à 'n', strncpy()' remplit le reste de 'dest' avec des octets nuls." –

0

Vous devez définir le terminateur null manuellement lorsque vous utilisez strncpy:

strncpy(string, "StringToCompare", 48); 
string[49] = 0; 
+0

uniquement si la chaîne était trop longue. –

+0

@KarolyHorvath: nem, mindig. Én est pont ugyanezt írtam. –

-1

strcopy et strncpy: dans cette situation, ils se comportent de manière identique !!

Vous ne nous dit pas la vérité ou l'image (par exemple: la chaîne est au moins 49 caractères)

0

Beaucoup de suppositions apparentes dans les autres réponses, mais une suggestion rapide. Tout d'abord, le code tel qu'il est écrit devrait fonctionner (et fonctionne en fait dans Visual Studio 2010). La clé est dans les détails de 'strncpy' - il ne sera pas implicite ajouter un caractère de fin null sauf si la longueur de la source est inférieure à la longueur de destination (ce qui est dans ce cas). D'autre part, inclut le terminateur null dans tous les cas, ce qui suggère que votre compilateur ne gère pas correctement la fonction strncpy.

Donc, si cela ne fonctionne pas sur votre compilateur, vous devriez probablement initialiser votre mémoire tampon temporaire comme ceci:

char string[50] = {0}; // initializes all the characters to 0 

// below should be 50, as that is the number of 
// characters available in the string (not 49). 
strncpy(string, "StringToCompare", 50); 

Cependant, je soupçonne que cela est probablement juste un exemple, et dans le monde réel votre chaîne source est 49 (encore, vous devez passer 50 à strncpy dans ce cas) caractères ou plus, auquel cas le terminateur NULL n'est pas copié dans votre chaîne temporaire.

Je ferais écho aux suggestions dans les commentaires pour utiliser std::string si disponible. Il prend soin de tout cela pour vous, afin que vous puissiez vous concentrer sur votre implémentation plutôt que sur ces détails banals.

0

Le paramètre de nombre d'octets dans strncpy indique à la fonction le nombre d'octets à copier et non la longueur du tampon de caractères. Donc, dans votre cas, vous demandez de copier 49 octets de votre chaîne constante dans le tampon, ce que je ne pense pas être votre intention!

Cependant, cela n'explique pas pourquoi vous obtenez le résultat anormal. Quel compilateur utilisez-vous? Quand je cours ce code sous VS2005 j'obtiens le comportement correct.

Notez que strncpy() a été dépréciée en faveur de strncpy_s, qui ne veut la longueur du tampon qui lui est passé:

strncpy_s (string,sizeof(string),"StringToCompare",49) 
+0

vérifiez la documentation de [strncpy] (http://msdn.microsoft.com/en-us/library/xdsywd25 (v = vs.80) .aspx) ... 'Si count est supérieur à la longueur de strSource, la chaîne de destination est complétée avec des caractères nuls jusqu'à la longueur count.' ... c'est-à-dire qu'elle ne copiera pas dans "StringToCompare" au-delà de sizeof ("StringToCompare") ... +1 pour mettre l'accent sur 'strncpy_s' – user1055604

Questions connexes