Comment itérer sur une chaîne en C?

Droit maintenant, je vais essayer ceci:

#include <stdio.h>

int main(int argc, char *argv[]) {

    if (argc != 3) {

        printf("Usage: %s %s sourcecode input", argv[0], argv[1]);
    }
    else {
        char source[] = "This is an example.";
        int i;

        for (i = 0; i < sizeof(source); i++) {

            printf("%c", source[i]);
        }
    }

    getchar();

    return 0;
}

cela ne fonctionne pas non plus:

char *source = "This is an example.";
int i;

for (i = 0; i < strlen(source); i++){

    printf("%c", source[i]);
}

j'ai l'erreur

<!-0x5bf714cf (msvcr100d.dll) in Test.exe: 0xC0000005: Violation de L'accès en lisant à la position 0x00000054.

(traduit librement de l'allemand)

alors qu'est-ce qui ne va pas avec mon code?

37
demandé sur Peter Mortensen 2010-07-09 18:58:00

11 réponses

Vous voulez:

for (i = 0; i < strlen(source); i++){

sizeof vous donne la taille du pointeur, pas la chaîne. Cependant, cela aurait fonctionné si vous aviez déclaré le pointeur comme un tableau:

char source[] = "This is an example.";

mais si vous passez le tableau à la fonction, cela aussi se dégradera en pointeur. Pour les cordes, il est préférable d'utiliser strlen. Et notez ce que d'autres ont dit sur le changement de printf pour utiliser %c. Et aussi, en tenant compte des commentaires de mmyers sur l'efficacité, il serait préférable de déplacer l'appel à strlen out de la boucle:

int len = strlen( source );
for (i = 0; i < len; i++){

ou de réécriture de la boucle:

for (i = 0; source[i] != 0; i++){
43
répondu 2010-07-09 15:05:30

Un idiome commun est:

char* c = source;
while (*c) putchar(*c++);

quelques remarques:

  • en C, les chaînes sont null. Vous itérez alors que le caractère de lecture n'est pas le caractère nul.
  • *c++ incrémente c et renvoie le déréférencé vieux valeur c.
  • printf("%s") imprime une chaîne nul, pas un char. C'est la cause de votre violation d'accès.
34
répondu Alexandre C. 2017-09-03 19:13:15

sizeof(source) renvoie le nombre d'octets requis par le pointeur char*. Vous devez le remplacer par strlen(source) qui sera la longueur de la chaîne que vous essayez d'affichage.

vous devriez aussi probablement remplacer printf("%s",source[i])printf("%c",source[i]) puisque vous affichez un caractère.

2
répondu Jacob 2010-07-09 15:00:08
  1. sizeof () inclut le caractère terminal null. Vous devriez utiliser strlen () (mais mettre l'appel en dehors de la boucle et le sauvegarder dans une variable), mais ce n'est probablement pas ce qui cause l'exception.
  2. vous devez utiliser "%c", pas" %s " dans printf - vous imprimez un caractère, pas une chaîne de caractères.
2
répondu KenE 2010-07-09 15:03:15

Cela devrait fonctionner

 #include <stdio.h>
 #include <string.h>

 int main(int argc, char *argv[]){

    char *source = "This is an example.";
    int length = (int)strlen(source); //sizeof(source)=sizeof(char *) = 4 on a 32 bit implementation
    for (int i = 0; i < length; i++) 
    {

       printf("%c", source[i]);

    }


 }
2
répondu Prasoon Saurav 2010-07-09 15:11:13

au lieu d'utiliser strlen comme suggéré ci-dessus, vous pouvez simplement vérifier le caractère nul:

#include <stdio.h>

int main(int argc, char *argv[])
{
    const char *const pszSource = "This is an example.";
    const char *pszChar = pszSource;

    while (pszChar != NULL && *pszChar != '')
    {
        printf("%s", *pszChar);
        ++pszChar;
    }

    getchar();

    return 0;
}
2
répondu Mark Ingram 2013-04-03 13:44:43
  • sizeof(source) vous revient de la taille d'un char*, pas la longueur de la corde. Vous devriez être en utilisant strlen(source), et vous devriez déplacer cela hors de la boucle, ou bien vous recalculerez la taille de la chaîne chaque boucle.
  • en imprimant avec le %s modificateur de format,printf est à la recherche d'un char*, mais vous êtes réellement en passant un char. Vous devez utiliser le %c modificateur.
1
répondu JSBձոգչ 2010-07-09 15:03:02

remplacez sizeof par strlen et ça devrait marcher.

0
répondu Keith Randall 2010-07-09 15:00:50

sizeof(source) renvoie sizeof a pointer as source est déclaré comme char *. Bonne façon de l'utiliser est strlen(source).

Suivant:

printf("%s",source[i]); 

attend une chaîne de caractères. I. e %s s'attend à une chaîne de caractères mais vous itérez dans une boucle pour imprimer chaque caractère. Donc utiliser le %c.

cependant votre façon d'accéder(itérer) à une chaîne en utilisant l'index i est correcte et donc il n'y a pas d'autres problèmes.

0
répondu Praveen S 2010-07-09 15:12:39

il suffit de changer de taille avec strlen.

Comme ceci:

char *source = "This is an example.";
int i;

for (i = 0; i < strlen(source); i++){

    printf("%c", source[i]);

}
0
répondu Pablo Santa Cruz 2010-07-09 15:18:57

vous avez besoin d'un pointeur vers le premier char pour avoir une chaîne ANSI.

printf("%s", source + i);

va faire le travail

Plus, bien sûr que vous auriez dû dire strlen(source), pas sizeof(source).

0
répondu ULysses 2015-05-26 20:10:39