2012-04-27 90 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分隔符(的