web-dev-qa-db-fra.com

C itérer à travers un tableau de caractères avec un pointeur

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 chars points du pointeur?

6

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;
}
7
mdatsev

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;
}
2
Vlad from Moscow