webentwicklung-frage-antwort-db.com.de

C ein Char-Array in verschiedene Variablen aufteilen

Wie kann ich in C ein Zeichenarray durch ein Trennzeichen trennen? Oder ist es besser, einen String zu manipulieren? Was sind einige gute C-Char-Manipulationsfunktionen? 

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

sie können sich dieses Programm ansehen. Zuerst sollten Sie das Strtok (Eingabe ",") verwenden. Die Eingabe ist die Zeichenfolge, die Sie erstellen möchten. Dann verwenden Sie das Strtok (NULL, ","). Wenn der Rückgabewert true ist, können Sie die andere Gruppe drucken.

13
Hong Wei

Schauen Sie sich strtok () an. strtok () ist keine Wiedereintrittsfunktion.

strtok_r () ist die einlaufende Version von strtok (). Hier ist ein Beispielprogramm aus dem Handbuch:

   #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);
   }

Probelauf, der auf Subokens arbeitet, die mit dem vorherigen Token basierend auf einem anderen Trennzeichen erhalten wurden:

$ ./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.

Eine Möglichkeit ist strtok

beispiel:

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

Sie möchten es an der Stelle zwischen den beiden Wörtern aufteilen

split=strtok(name," ");

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

Sie können die Trennzeichen einfach durch NULL-Zeichen ersetzen und die Adresse nach dem neu erstellten NULL-Zeichen in einem neuen Zeichen char * speichern:

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

Beachten Sie, dass dieser Code natürlich nicht funktioniert, wenn die Eingabezeichenfolge mehr als 9 Trennzeichen enthält.

3
mic_e

Ich habe mir das ausgedacht. Dies scheint am besten für mich zu funktionieren. Es konvertiert eine Zahl aus Zahlen und teilt sie in ein Array mit Ganzzahl auf: 

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

So mache ich es.

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

Darüber hinaus können Sie sscanf für einige sehr einfache Szenarien verwenden, zum Beispiel wenn Sie genau wissen, wie viele Teile Der String hat und woraus er besteht. Sie können die Argumente auch spontan analysieren. Verwenden Sie es nicht für Benutzereingaben, da die Funktion keine Konvertierungsfehler meldet.

Beispiel:

char text[] = "1:22:300:4444:-5";
int i1, i2, i3, i4, i5;
sscanf(text, "%d:%d:%d:%d:%d", &i1, &i2, &i3, &i4, &i5);
printf("%d, %d, %d, %d, %d", i1, i2, i3, i4, i5);

Ausgabe:

1, 22, 300, 4444, -5

Für etwas Fortgeschritteneres sind strtok () und strtok_r () die besten Optionen, wie in anderen Antworten erwähnt.

0
dinomario10