2012-04-27 3 views
5

В C Как я могу выделить массив символов разделителем? или лучше манипулировать строкой? каковы некоторые хорошие функции манипуляции c char?C разделить массив символов на разные переменные

+0

возможно дубликат [Split строки с разделителями в C] (http://stackoverflow.com/questions/9210528/split-string-with-delimiters-in-c) –

ответ

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

вы можете посмотреть эту программу .Первый вы должны использовать strtok (вход «„). Вход является строка, которую вы хотите spilt.Then использовать strtok (NULL,“,»). Если возвращаемое значение истинно, вы можете распечатать другую группу.

+1

Спасибо за код, извините, тупой вопрос, почему вы используете strtok во второй раз? Кроме того, что означает «Если возвращаемое значение истинно, вы можете распечатать другую группу». имею в виду? –

8

Посмотрите на strtok(). strtok() не является функцией повторного входа.

strtok_r() является повторной версией strtok(). Вот пример программа из руководства:

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

Sample бега, который действует на subtokens, который был получен из предыдущих маркеров на основе другого разделителя:

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

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

Может ли это манипулировать массивом char или быть строкой? –

+1

Пожалуйста, не рекомендуем 'strtok', он не реентерабелен. Его «взрослый брат» 'strtok_r' намного лучше. – dasblinkenlight

+1

@Thiruvalluvar: это не только безопасность потоков - что делать, если вы хотите одновременно использовать две разные строки, например. в том же цикле? –

3

Одним из вариантов является strtok

примера :

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

Вы хотите разбить его на пространство между двумя словами s

split=strtok(name," "); 

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

Вы можете просто заменить символы разделителей от NULL символов, а также хранить адрес после вновь созданного символа НОЛЬ в новом символ * указатель:

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

Следует заметить, что этот код будет, конечно, не работают, если строка ввода содержит более 9 символов разделителя.

1

я придумал this.This, кажется, работает лучше всего для me.It преобразует строку числа и разбивает его на массив целого:

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; 
} 
Смежные вопросы