Question

J'ai une chaîne en C ++ de type const char* passé comme argument à strlen, mais il retourne void.

il va comme

strlen(astruct.string);

Merci ..

EDIT: Est-ce que des vérifications,

strlen("test");

donne encore vide .. pourquoi?

EDIT: Voici l'image http://img14.imageshack.us/img14/1808/strlen.png

Désolé d'être pas clair auparavant. Le formatage ne fonctionnait pas très bien. Quoi qu'il en soit, la confusion a été résolu à la fois par Evan Teran et Vlad Romascanu. Jetez aussi un coup d'œil à la réponse de Brian R. Bondy.

Merci. Ne hésitez pas à fermer.

Était-ce utile?

La solution

En référence à votre capture d'écran: votre débogueur affiche <void> pour strlen(...) alors qu'en fait, il devrait afficher une erreur

.

Vous ne pouvez pas appeler des méthodes et afficher leurs résultats à la veille du débogueur. Le débogueur affiche uniquement des variables et des données existantes. Il ne peut invoquer des méthodes arbitraires sur la demande étant donné que les méthodes peuvent modifier l'état du programme en cours de débogage d'une manière qui n'ont pas été prévu soit par l'auteur du code, ni par le débogueur.

Qu'est-ce que vous pouvez faire est, dans votre code, ajoutez temporairement:

size_t tmp_len = strlen(struc.string);

puis compiler et ajouter tmp_len à la montre.

Autres conseils

Vous êtes confus par le débogueur merdique de Visual Studio 6.0. Ne vous fiez pas à ce sujet. Il pourrait probablement pas obtenir la valeur de retour en raison de inline ou quelque chose de similaire.

Imprimer la valeur sur pour obtenir la valeur réelle.

EDIT: En outre, à partir de votre exemple, il semble que vous ne pouvez pas être stocker le résultat de strlen de toute façon. Cela peut aussi être une raison pour laquelle le débogueur ne voit pas la valeur de retour. Il est tout à fait possible que le compilateur a décidé qu'il n'a pas besoin d'exécuter l'strlen si vous n'utilisez pas la valeur.

NOTE: à ce stade, il n'y a aucune excuse réelle toujours en utilisant VC ++ 6.0. Il est un compilateur ancien et IDE qui est un compilateur C ++ honteusement pauvres. Les versions plus récentes du compilateur Visual C ++ sont gratuits (sans IDE), les utiliser.

strlen n'est pas de type de retour vide, c'est votre débogueur qui ne donne pas le bon message.

Pourquoi votre debbuger montre vide?

La mise en œuvre de strlen que vous utilisez est probablement enroulé autour d'un #define strlen someothername_strlen.

Le débogueur ne peut pas afficher #define correctement ou d'autres modificateurs sur la fonction.

Vous devrez faire quelque chose comme ilen = strlen ( « test ») puis vérifiez ilen votre montre.

Normalement, vous pouvez appeler des fonctions dans votre montre. Par exemple essayer de définir la fonction suivante puis appelez dans votre montre:

int testFunc(char*)
{
  return 5;
}

Vous obtiendrez probablement 5 dans votre montre en conséquence.

strlen renvoie un entier, donc je suppose que vous voulez dire qu'il retourne "0".

En outre, la manière que vous spécifiez votre type de données, je ne peux pas tout à fait dire si c'est un const char * ou const char **. Si c'est celui-ci, vous devez vous assurer que vous êtes le déréférencement ** à un seul *.

Je pense que la chaîne commence par un octet nul, ce qui est la raison pour laquelle il est de retour 0.

En C ++, les fonctions renvoient toujours une valeur du type qu'ils sont déclarés revenir. Depuis la déclaration de fonction strlen ressemble à quelque chose comme ceci:

size_t strlen(const char *);

la seule chose qu'il peut peut est un retour size_t. Le compilateur utilise ces informations au moment de la compilation pour déterminer comment gérer la valeur de retour lorsque vous appelez la fonction. Le point est que si la fonction strlen est déclarée comme ci-dessus, il ne peut pas décider de revenir void parfois et une valeur de type size_t autres fois.

Ceci est généralement une caractéristique des langages typés comme statiquement C ++. Dans Les langages typés dynamiquement (Perl, Python, Ruby, PHP, etc) une fonction peut décider de renvoyer une valeur de tout type à chaque fois qu'il est appelé.

Il ne peut revenir vide. Void est l'absence d'une valeur de retour, de sorte que vous ne pouvez pas, err, retournez-le.

Comment vérifier pour vide de toute façon? Void est pas une valeur. S'il vous plaît montrer comment vous obtenez vide. Est-il temps de compilation ou le temps d'exécution?

Si vous avez en fait un système où strlen est déclaré avec un type de retour de void, courir aussi vite que possible dans l'autre sens.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top