2012-04-27 28 views
5

En C, ¿cómo puedo separar una matriz de caracteres por un delimitador? o es mejor manipular una cadena? ¿Cuáles son algunas buenas funciones de manipulación de c char?C dividir una matriz de caracteres en diferentes variables

+0

posible duplicado de [Separar una cadena con delimitadores en C] (http://stackoverflow.com/questions/9210528/split-string-with-delimiters-in-c) –

Respuesta

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

se puede ver este programa .First se debe utilizar el strtok (entrada, " "). Entrada es la cadena que desea spilt.Then utiliza el strtok (NULL,""). Si el valor de retorno es verdadero, puede imprimir el otro grupo.

+1

Gracias por el código, pregunta tonta, ¿por qué estás usando strtok por segunda vez? Además, ¿qué significa "Si el valor de retorno es verdadero, puede imprimir el otro grupo". ¿media? –

8

Mire strtok(). strtok() no es una función reentrante.

strtok_r() es la versión re-entrante de strtok(). Aquí está un programa de ejemplo en el manual:

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

muestra de ejecución que opera sobre subtokens que se obtuvo de la ficha anterior basado en un delimitador diferente:

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

1: hello:word:bye 
--> hello 
--> word 
--> bye 
2: abc:def:ghi 
--> abc 
--> def 
--> ghi 
+0

¿Puede eso manipular una matriz de caracteres o debe ser una cadena? –

+1

Por favor, no recomiende 'strtok', no es reentrante. Su "hermano mayor" 'strtok_r' es mucho mejor. – dasblinkenlight

+1

@Thiruvalluvar: no se trata solo de seguridad de subprocesos, ¿qué pasaría si quieres poner dos cadenas diferentes al mismo tiempo, p. en el mismo bucle? –

3

Una opción es strtok

ejemplo :

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

Quiere dividirlo en el espacio entre las dos palabras s

split=strtok(name," "); 

while(split != NULL) 
{ 
    word=split; 
    split=strtok(NULL," "); 
} 
1

Usted podría simplemente reemplazar los caracteres de separación de caracteres NULL, y almacenar la dirección después de que el carácter nulo recién creado en un nuevo char * puntero:

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

Tenga en cuenta que este código, por supuesto, no funciona si la cadena de entrada contiene más de 9 caracteres separadores.

1

me ocurrió con this.This parece funcionar mejor para me.It convierte una cadena de número y la divide en gama de número entero:

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