web-dev-qa-db-fra.com

C diviser un tableau de caractères en différentes variables

En C, comment puis-je séparer un tableau de caractères par un délimiteur? Ou est-il préférable de manipuler une chaîne? Quelles sont les bonnes fonctions de manipulation du char C? 

9
Daniel Del Core
#include<string.h>
#include<stdio.h>
int main()
{
    char input[16] = "abc,d";
    char *p;
    p = strtok(input, ",");

    if(p)
    {
    printf("%s\n", p);
    }
    p = strtok(NULL, ",");

    if(p)
           printf("%s\n", p);
    return 0;
}

vous pouvez regarder ce programme. Vous devez d’abord utiliser le strtok (entrée, ","). input est la chaîne que vous voulez spilter. Ensuite, vous utilisez le strtok (NULL, ","). Si la valeur de retour est true, vous pouvez imprimer l'autre groupe.

13
Hong Wei

Regardez strtok () . strtok () n'est pas une fonction ré-entrante.

strtok_r () est la version ré-entrante de strtok (). Voici un exemple de programme tiré du manuel:

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

   int main(int argc, char *argv[])
   {
       char *str1, *str2, *token, *subtoken;
       char *saveptr1, *saveptr2;
       int j;

       if (argc != 4) {
           fprintf(stderr, "Usage: %s string delim subdelim\n",argv[0]);
           exit(EXIT_FAILURE);
       }

       for (j = 1, str1 = argv[1]; ; j++, str1 = NULL) {
           token = strtok_r(str1, argv[2], &saveptr1);
           if (token == NULL)
               break;
           printf("%d: %s\n", j, token);

           for (str2 = token; ; str2 = NULL) {
               subtoken = strtok_r(str2, argv[3], &saveptr2);
               if (subtoken == NULL)
                   break;
               printf(" --> %s\n", subtoken);
           }
       }

       exit(EXIT_SUCCESS);
   }

Exemple d'analyse qui opère sur des sous-octets obtenus à partir du jeton précédent sur la base d'un délimiteur différent:

$ ./a.out hello:Word:bye=abc:def:ghi = :

1: hello:Word:bye
 --> hello
 --> Word
 --> bye
2: abc:def:ghi
 --> abc
 --> def
 --> ghi
10
P.P.

Une option est strtok

exemple:

char name[20];
//pretend name is set to the value "My name"

Vous voulez le séparer dans l'espace entre les deux mots

split=strtok(name," ");

while(split != NULL)
{
    Word=split;
    split=strtok(NULL," ");
}
3
Andrew

Vous pouvez simplement remplacer les caractères de séparation par des caractères NULL et stocker l'adresse après le nouveau caractère NULL dans un nouveau pointeur char *:

char* input = "asdf|qwer"
char* parts[10];
int partcount = 0;

parts[partcount++] = input;

char* ptr = input;
while(*ptr) { //check if the string is over
    if(*ptr == '|') {
        *ptr = 0;
        parts[partcount++] = ptr + 1;
    }
    ptr++;
}

Notez que ce code ne fonctionnera évidemment pas si la chaîne d'entrée contient plus de 9 caractères de séparation.

3
mic_e

Cela semble fonctionner mieux pour moi.Il convertit une chaîne de nombre et le divise en tableau d'entiers: 

void splitInput(int arr[], int sizeArr, char num[])
{
    for(int i = 0; i < sizeArr; i++)
        // We are subtracting 48 because the numbers in ASCII starts at 48.
        arr[i] = (int)num[i] - 48;
}
3
Khaled Mohammad

C'est comme ça que je le fais.

void SplitBufferToArray(char *buffer, char * delim, char ** Output) {

    int partcount = 0;
    Output[partcount++] = buffer;

    char* ptr = buffer;
    while (ptr != 0) { //check if the string is over
        ptr = strstr(ptr, delim);
        if (ptr != NULL) {
            *ptr = 0;
            Output[partcount++] = ptr + strlen(delim);
            ptr = ptr + strlen(delim);
        }

    }
    Output[partcount++] = NULL;
}
1
Zeus