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?
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++){
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émentec
et renvoie le déréférencé vieux valeurc
.printf("%s")
imprime une chaîne nul, pas un char. C'est la cause de votre violation d'accès.
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.
- 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.
- vous devez utiliser "%c", pas" %s " dans printf - vous imprimez un caractère, pas une chaîne de caractères.
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]);
}
}
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;
}
sizeof(source)
vous revient de la taille d'unchar*
, pas la longueur de la corde. Vous devriez être en utilisantstrlen(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'unchar*
, mais vous êtes réellement en passant unchar
. Vous devez utiliser le%c
modificateur.
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.
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]);
}
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)
.