Je suis très nouveau en C et je me demandais comment obtenir chaque élément d'un tableau à l'aide d'un pointeur. Ce qui est facile si et seulement si vous connaissez la taille du tableau. Alors laissez le code être:
#include <stdio.h>
int main (int argc, string argv[]) {
char * text = "John Does Nothing";
char text2[] = "John Does Nothing";
int s_text = sizeof(text); // returns size of pointer. 8 in 64-bit machine
int s_text2 = sizeof(text2); //returns 18. the seeked size.
printf("first string: %s, size: %d\n second string: %s, size: %d\n", text, s_text, text2, s_text2);
return 0;
}
Maintenant, je veux déterminer la taille de text
. pour ce faire, j'ai découvert que la chaîne se terminera par un '\0'
personnage. J'ai donc écrit la fonction suivante:
int getSize (char * s) {
char * t; // first copy the pointer to not change the original
int size = 0;
for (t = s; s != '\0'; t++) {
size++;
}
return size;
}
Cette fonction ne fonctionne cependant pas car la boucle ne semble pas se terminer.
Alors, existe-t-il un moyen d'obtenir la taille réelle des char
s points du pointeur?
Au lieu de vérifier le pointeur, vous devez vérifier la valeur actuelle. Vous pouvez le faire comme ceci:
int getSize (char * s) {
char * t; // first copy the pointer to not change the original
int size = 0;
for (t = s; *t != '\0'; t++) {
size++;
}
return size;
}
Ou plus précisément:
int getSize (char * s) {
char * t;
for (t = s; *t != '\0'; t++)
;
return t - s;
}
Il y a une faute de frappe dans cette boucle for
for (t = s; s != '\0'; t++) {
^^^^^^^^^
Je pense que vous voulez dire
for (t = s; *t != '\0'; t++) {
^^^^^^^^^
Néanmoins, en général, la fonction ne fournit pas une valeur équivalente à la valeur renvoyée par l'opérateur sizeof
même si vous comptez également le zéro de fin. Au lieu de cela, il fournit une valeur équivalente à la valeur renvoyée par la fonction standard strlen
.
Par exemple, comparez la sortie de cet extrait de code
#include <string.h>
#include <stdio.h>
//...
char s[100] = "Hello christopher westburry";
printf( "sizeof( s ) = %zu\n", sizeof( s ) );
printf( "strlen( s ) = %zu\n", strlen( s ) + 1 );
Votre fonction calcule donc simplement la longueur d'une chaîne.
Il serait plus correct de le définir de la manière suivante (en utilisant des pointeurs)
size_t getSize ( const char * s )
{
size_t size = 0;
while ( *s++ ) ++size;
return size;
}