2012-04-27 73 views
5

在C中,如何通過分隔符來分隔char數組?或者更好地操縱一個字符串?什麼是一些很好的c char操作函數?C將char數組拆分爲不同的變量

+0

可能重複http://stackoverflow.com/questions/9210528/split-string-with-delimiters-in-c) – 2012-04-27 23:42:03

回答

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,’」)。如果返回值爲true,則可以打印另一個組。

+1

謝謝你的代碼,對不起愚蠢的問題,你爲什麼第二次使用strtok?另外,「如果返回值爲true,您可以打印另一個組。」意思? – 2012-12-14 16:22:07

8

看看strtok() strtok()不是可重入函數。

strtok_r()是strtok()的重入版本。下面是從手動的示例方案:

,其上,將其從基於不同的定界符之前的令牌獲得subtokens操作
#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); 
    } 

樣品運行:

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

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

可以操縱一個字符數組或必須是一個字符串? – 2012-04-27 10:53:40

+1

請不要推薦'strtok',它是不可重入的。它的「長大的兄弟」'strtok_r'好得多。 – dasblinkenlight 2012-04-27 10:54:07

+1

@Thiruvalluvar:它不僅僅是線程安全 - 如果你想同時標記兩個不同的字符串,例如在同一個循環中? – 2012-04-27 11:04:59

3

一個選項的strtok

示例:

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

你想它在兩個詞之間的空間分割小號

split=strtok(name," "); 

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

你可以簡單地替換由NULL字符分隔符,並存儲在一個新的char *指針新創建的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; 
} 
[分割字符串在C分隔符(的