web-dev-qa-db-fra.com

Comment déterminez-vous la longueur d'un caractère non signé *?

Comment déterminez-vous la longueur d'un caractère non signé *?

24
ads

Pour la taille réelle du pointeur:

size_t s = sizeof(unsigned char*);

Si vous voulez la longueur de la chaîne:

unsigned char* bla = (unsigned char*)"blabla";
int s = strlen((char*)bla);
32
joce

Il pourrait y avoir deux sens à cela. Voulez-vous simplement connaître la taille du type de pointeur? Si oui, alors la réponse de Joce est correcte

size_t size = sizeof(unsigned char*);

Si vous voulez savoir sur combien d'éléments le pointeur pointe, c'est un peu plus complexe. S'il s'agit d'une chaîne de style C, alors strlen ou une variante est votre meilleure option.

Cependant, si ce n'est qu'un pointeur vers un caractère non signé qui n'a aucun rapport avec une chaîne de style C, il n'y a aucun moyen d'atteindre de manière fiable ce que vous recherchez. C/C++ n'associe pas un champ de longueur à un pointeur. Vous devrez transmettre la longueur avec le pointeur ou utiliser une classe comme un vecteur qui stocke à la fois le pointeur et la longueur.

9
JaredPar

Dans un monde idéal, vous ne le faites pas. Vous utilisez char * pour les chaînes de style C (qui se terminent par NUL et vous pouvez mesurer la longueur de), et char * non signé uniquement pour les données d'octet (qui est fourni avec sa longueur dans un autre paramètre ou autre, et dans lequel vous entrez probablement un conteneur STL ASAP, tel que vector<unsigned char> ou basic_string<unsigned char>).

Le problème racine est que vous ne pouvez pas faire d'hypothèses portables quant à savoir si les représentations de stockage de char et de char non signé sont les mêmes. Ils le sont généralement, mais ils ne peuvent pas l'être. Il n'y a donc pas de fonctions de bibliothèque de type chaîne qui fonctionnent sur char non signé *, uniquement sur char *, et il n'est généralement pas sûr de transtyper char non signé * en char signé * et de traiter le résultat comme une chaîne. Étant donné que char peut être signé, cela signifie qu'il n'est pas nécessaire de convertir char * non signé en char *.

Cependant, 0 est toujours la même représentation de valeur dans char non signé et char. Donc, dans un monde non idéal, si vous avez une chaîne de style C quelque part mais qu'elle est arrivée sous la forme d'un caractère non signé *, alors vous (a) la transformez en char * et continuez, mais aussi (b ) savoir qui vous a fait cela et leur demander de s’arrêter.

9
Steve Jessop

Si vous utilisez C++, et sa chaîne dans un caractère non signé *, vous feriez mieux de le mettre d'abord dans une chaîne std :: avant de le manipuler. De cette façon, vous pouvez lui faire toutes sortes de choses et toujours en obtenir la longueur () et/ou la capacité () quand vous le souhaitez.

Je suppose que vous faites des choses sur ledit tableau pour rendre sa taille non constante. Si vous allouez, définissez et oubliez, vous pouvez toujours stocker la taille d'allocation réelle du tableau dans une variable distincte - ou mieux, créer une structure/classe.

//WARNING: memory issues not addressed here.
struct myStringStruct
{
  unsigned char * string;
  int len;

  allocate(int size) {
    len = size;
    string = malloc(sizeof(unsigned char) * len);
  }
}

Plus complexe que cela et vous réinventez std :: string.

0
cyberconte

si vous compilez en code c, les paramètres de la fonction strlen() peuvent traiter “unsigned char*”; mais en code c ++, les params ne peuvent pas traiter "unsigned char*"; donc si vous compilez du code c ++, vous devez forcer la traduction (unsigned char*)str.

0
Ageliver

Voulez-vous la longueur du pointeur, qui serait un int. Si vous voulez la longueur de la chaîne pointée, utilisez strlen: par ex. Taille du pointeur: sizeof (caractère non signé *) Taille de la chaîne: strlen (caractère non signé *) Les caractères multi-octets seront signalés comme .. octets multiples

0
Rohit