2010-12-13 7 views
2

J'ai beaucoup de mal à comprendre cela. J'ai une chaîne C, et je veux enlever la première partie. Disons que c'est: "Nourriture, quantité, calories". Je veux copier chacune de ces valeurs, mais pas les virgules. Je trouve la virgule, et renvoie la position de la virgule à ma méthode. Puis-je utiliserEnlever la première partie d'une chaîne C

strncpy(aLine.field[i], theLine, end); 

Pour copier « Theline » à mon tableau à la position « i », avec seulement les premiers caractères « fin » (pour la première fois, « fin » serait 4, parce que c'est là la la première virgule est). Mais ensuite, parce que c'est dans une boucle, je veux enlever "Food" du tableau, et recommencer le processus. Cependant, je ne vois pas comment je peux enlever la première partie (ou déplacer le pointeur de tableau vers l'avant?) Et garder le reste. Toute aide serait utile!

Répondre

2

Qu'est-ce que vous avez besoin est de couper des chaînes avec une virgule comme séparateur.

Vous avez besoin de strtok pour cela. Voici un exemple de code pour vous:

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


    char *s = "asdf,1234,qwer"; 
    char str[15]; 
    strcpy(str, s); 
    printf("\nstr: %s", str); 
    char *tok = strtok(str, ","); 
    printf("\ntok: %s", tok); 
    tok = strtok(NULL, ","); 
    printf("\ntok: %s", tok); 
    tok = strtok(NULL, ","); 
    printf("\ntok: %s", tok); 

    return 0; 
} 

Cela vous donnera la sortie suivante:

str: asdf,1234,qwer 
tok: asdf 
tok: 1234 
tok: qwer 
+1

En fait, sur la plupart des machines, cela va se bloquer lorsque strtok tente d'écrire à la constante chaîne de lecture seule. –

+0

yup. Ce code est à des fins de démonstration uniquement en ce qui concerne l'utilisation de strtok. :-) –

+0

@ChrisDodd: hâtivement upvoted votre commentaire (pas d'annulation) mais ne sont pas d'accord. La chaîne constante '* s' est copiée dans cstring' str', chaque appel à strtok modifie cstring (en remplaçant ',' par '0' terminator) et retourne l'adresse du token. Il n'y a donc pas de chaîne constante en lecture seule réécrite ici. Ai-je tort? – Salvador

0

Personnellement, j'utilise strtok().

Je ne recommanderais pas de retirer les jetons extraits de la chaîne. Supprimer une partie d'une chaîne nécessite de copier les caractères restants, ce qui n'est pas très efficace. Au lieu de cela, vous devez garder une trace de vos positions et copier simplement les sections que vous voulez dans la nouvelle chaîne.

Mais, encore une fois, j'utiliserais strtok(). Si vous savez où est la virgule, vous pouvez simplement continuer à lire la chaîne à partir de ce moment-là.

0

par exemple

void readTheString(const char *theLine) 
{ 
    const char *wordStart = theLine; 
    const char *wordEnd = theLine; 

    int i = 0; 
    while (*wordStart) // while we haven't reached the null termination character 
    { 
     while (*wordEnd != ',') 
      wordEnd++; 
     // ... copy the substring ranging from wordStart to wordEnd 
     wordStart = ++wordEnd; // start the next word 
    } 
} 

ou quelque chose comme ça.
la vérification de terminaison nulle est probablement erronée, sauf si la chaîne se termine également par un ',' ... mais vous avez l'idée. Quoi qu'il en soit, en utilisant strtok serait probablement une meilleure idée.

2

Si vous devez conserver la chaîne d'origine, alors strtok. Dans le cas contraire, vous pouvez remplacer chaque séparateur avec '\0' et utiliser les chaînes obtenues directement:

char s_RO[] = "abc,123,xxxx", *s = s_RO; 
while (s){ 
    char* old_str = s; 
    s = strchr(s, ','); 
    if (s){ 
     *s = '\0'; 
     s++; 
    }; 
    printf("found string %s\n", old_str); 
}; 
Questions connexes