11
votes

Taille de char * tableau en C / C ++

Il y a beaucoup de renseignements similaires, mais dans mon cas, je ne comprends pas ce qui ne fonctionne pas: xxx

ces sorties: xxx

Comment est-il possible? 4 n'est certainement pas la taille de cette chaîne. J'ai même essayé ce qui suit, avec le même résultat:

MySize = Taille de taille (Samplestring) / Tailleof (Samplestring [0]);

EDIT: OK , c'est la déclaration: xxx

Je suis sur C ++, mais je dois utiliser des fonctions qui n'acceptent que CHAR *. Plus tard dans le code, j'attribuais de nouvelles chaînes à cette variable, comme: xxx

Oui, le compilateur me donne des avertissements, mais je ne sais pas comment puis-je utiliser différentes chaînes si je Impossible de les écraser ...


7 commentaires

Comment SamPlestring a-t-il déclaré?


Où est la définition de SamPlustring ?


Vous avez réussi à laisser sortir l'information la plus importante!


String est un tableau de charme, n'est-ce pas? * p donne le premier élément s'il s'agit d'une matrice. Vous avez besoin d'une classe wrapper pour obtenir une taille plus correctement. Je pense que votre tableau est Qwwe + null


En C ++, Char * n'est pas la même chose que STD: String, pas plus que la chaîne de Java ou les chaînes Python de Java. Si vous voulez comprendre Char *, veuillez commencer par K & R C - Lire littéralement le livre K & R. Sinon, restez avec STD :: String - Cela peut vous garder en sécurité pendant un moment.


Dupliqué possible de C ++: Taillef pour la longueur de la matrice


Résolu mon problème en convertissant à C ++ String: STD :: String cppstring (SamPlustring); stringlength = cppstring.Size ();


6 Réponses :


15
votes

4 n'est pas la taille de la chaîne, car SamPlustring n'est pas une chaîne. C'est un char * , dont la taille est (sur votre plate-forme) 4, divisée par 1 (taille de char ) est correctement 4.

in c ++, vous utiliseriez std :: string et la longueur () méthode.

in c, vous utiliseriez strlen qui prend en tant que paramètre un pointeur de caractère NULL terminé.


1 commentaires

Existe-t-il une bonne référence (par exemple la page Web) où je peux trouver la taille de Char * sur différentes plates-formes?



0
votes

Vous demandez à la taille d'un pointeur sur un char. Donc, je suppose que vous utilisez un système 32 bits.

Si vous utilisez c ++, utilisez STD :: String: P>

std::string samplestring("Hello world");
std::cout << samplestring.size() << std::endl;


2 commentaires

Mais je suis obligé de faire de l'avant en arrière, alors comment puis-je mettre un char * dans une chaîne de C ++ appropriée, faire mes opérations, puis le renvoyer à un char *??


STD :: String SamPlustring (votre_c_string); Samplestring.c_str ();



0
votes

La taille d'un élément renvoie la taille de la mémoire allouée à cet objet. Dans votre exemple, la chaîne est probablement déclarée quelque part comme xxx

auquel cas la taille de la mémoire est 4. La méthode que vous voulez probablement dans votre application est xxx

qui retourne la taille de la chaîne terminée NULL (sans terminaison)


0 commentaires

4
votes

Il existe deux façons de faire une constante de chaîne et votre technique ne fonctionne que sur la première. Le premier rend un tableau de caractères que vous pouvez obtenir la taille de la compilation, et l'autre crée un pointeur à un tableau de caractères.

mysize = strlen(samplestring);


1 commentaires

Remarque (pour l'OP): la première décomposerait à un pointeur si elle est passée à une fonction, de sorte que le taille de donnerait le résultat que vous n'attendez que dans le même contexte.



1
votes

Il semble que vous ayez un pointeur, pas un tableau. Les tableaux sont convertis en pointeurs lorsque le programme le requiert, de sorte que vous obtiendriez: xxx

bien que, puisque Tailleof (char) == 1 , la division est redondante ici; Si le pointeur était à un plus grand type, vous obtiendriez un résultat différemment inattendu.

en C ++ (mais évidemment pas c), vous pouvez déduire la taille d'un tableau en tant que paramètre de modèle: xxx

ou vous pouvez utiliser des classes telles que std :: vecteur et std :: string pour garder une trace de la taille.

in c, vous pouvez utiliser strallen pour trouver la longueur d'une chaîne terminée zéro, mais dans la plupart des cas, vous devez suivre une trace des tailles de la matrice vous-même.


0 commentaires

5
votes

Tout d'abord, Tailleof (SamPlestring [0]) code> est identique à celui Tailleof (* Samplestring) code>, ils renvoient tous les deux la taille du premier élément de Le tableau code> SamPlustring code>. Et, en supposant que samplestring code> est un tableau de caractères, Tailleof (char) code> est défini à être 1.

Vous n'avez pas montré comment SamPlestring code > est déclaré. Il pourrait s'agir de l'un des éléments suivants: p> xxx pré>

ou p> xxx pré>

ou p> xxx Pré>

Dans les 2 premiers cas, le type de SamPlustring code> est char * code>, donc Tailleof (SamPlestring) code> retourne Taillef (code> Char *) code>, qui, sur votre plate-forme, est 4. p>

dans le troisième cas, le type de SamPlestring code> est char [10] code > (tableau de 10 caractères), mais si vous appelez une fonction qui prend un char * code> comme paramètre, le tableau de caractères de caractère Decay em> à un pointeur pointant sur le premier élément de la matrice. Dans ce cas, essayer d'imprimer taille de code> dans la fonction entraînera toujours la taille d'un pointeur étant imprimé. P>

Si vous souhaitez que la taille de la matrice d'origine soit imprimée à partir de Dans la fonction, le paramètre de fonction doit alors être un pointeur sur le type de matrice d'origine (et le type comprend la taille de la matrice d'origine). P>

42


0 commentaires