2012-04-27 15 views
5

सी में मैं एक डेलीमीटर द्वारा एक चार सरणी कैसे अलग कर सकता हूं? या एक स्ट्रिंग में हेरफेर करना बेहतर है? कुछ अच्छे सी चार मैनिपुलेशन कार्यों क्या हैं?सी विभिन्न चरों में एक चार सरणी विभाजित

+0

संभव डुप्लिकेट 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 का उपयोग करना चाहिए (इनपुट, ",")। इनपुट स्ट्रिंग क्या आप strtok का उपयोग spilt.Then करना चाहते हैं देख सकते हैं (शून्य, ",")। यदि वापसी मूल्य सत्य है, तो आप दूसरे समूह को प्रिंट कर सकते हैं।

+1

कोड के लिए धन्यवाद, क्षमा करें बेवकूफ सवाल, आप दूसरी बार स्ट्रोक का उपयोग क्यों कर रहे हैं? साथ ही, "क्या वापसी मूल्य सत्य है, तो आप दूसरे समूह को प्रिंट कर सकते हैं।" क्या मतलब है? –

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

नमूना रन जो subtokens जो पिछले टोकन एक अलग परिसीमक के आधार पर से प्राप्त हुई थी पर चल रही है:

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

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

क्या यह एक चार सरणी में हेरफेर कर सकता है या यह एक स्ट्रिंग होना चाहिए? –

+1

कृपया 'स्ट्रोकोक' की अनुशंसा न करें, यह गैर-पुनर्वित्तक है। इसका "बड़ा भाई" 'strtok_r' बहुत बेहतर है। – dasblinkenlight

+1

@ तिरुवल्लुवार: यह केवल थ्रेड-सुरक्षा नहीं है - क्या होगा यदि आप एक ही समय में दो अलग-अलग तारों को टोकन करना चाहते हैं, उदा। एक ही लूप में? –

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

आप बस शून्य पात्रों द्वारा विभाजक वर्ण की जगह सकता है, और एक नया चार * सूचक में नव निर्मित शून्य चरित्र के बाद पता की दुकान:

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

मैं हूँ.यह के साथ आया था सबसे अच्छा काम करने के लिए 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; 
} 
([सी में सीमांकक के साथ विभाजित स्ट्रिंग] की
संबंधित मुद्दे