2012-10-25 18 views
8

मैं स्ट्रिंग को टोकन में विभाजित करने के लिए strtok का उपयोग कर रहा हूं। क्या किसी को कोई फ़ंक्शन पता है जो वास्तव में टोकन की संख्या की गणना करता है?सी में टोकन गिनने का कोई तरीका है?

मेरे पास कमांड स्ट्रिंग है और मुझे इसे विभाजित करने और execve() पर तर्कों को पारित करने की आवश्यकता है।

धन्यवाद!

संपादित

execvechar** के रूप में तर्क लेता है, तो मैं संकेत की एक सरणी आवंटित करने के लिए की जरूरत है। मुझे नहीं पता कि कितने टोकन हैं, यह जानने के बिना कितने आवंटित किए जाएंगे।

+9

'strtok के रूप में ही होगा () 'और एक काउंटर में वृद्धि? – alex

+1

और 'realloc' को आकार को पहले से नहीं जानने की समस्या को हल करना चाहिए। –

उत्तर

8

एक दृष्टिकोण काउंटर के साथ strtok का उपयोग करना होगा। हालांकि, यह मूल स्ट्रिंग को संशोधित करेगा।

एक और दृष्टिकोण तो जैसे एक पाश में strchr उपयोग करने के लिए, यह है:

int count = 0; 
char *ptr = s; 
while((ptr = strchr(ptr, ' ')) != NULL) { 
    count++; 
    ptr++; 
} 

आप एक से अधिक सीमांकक है, का उपयोग strpbrk:

while((ptr = strpbrk(ptr, " \t")) != NULL) ... 
+0

strchr() कई फ़ील्ड डिलीमीटर होने पर बोझिल हो जाता है, उदाहरण के लिए विराम चिह्न। –

+0

आप उस मामले में 'strpbrk' का उपयोग कर सकते हैं। – nneonneo

+0

सही - बस strchr() नहीं; –

3

टोकन की संख्या के रूप में एक लेकिन कुछ भी की तुलना में अधिक है इस्तेमाल किए गए डेलीमीटर की घटना की आवृत्ति। तो आपका प्रश्न नीचे खोजने के लिए उबलता है। एक स्ट्रिंग में एक चरित्र की घटना की समय की

कहना ग में strtok समारोह में इस्तेमाल किया सीमांकक है ''

int count =0,i; 
char str[20] = "some string here"; 

for(i=0;i<strlen(str);i++){ 
    if(str[i] == ' ') 
     count++; 
} 

टोकन की संख्या गिनती + 1

+0

यदि नौकरी से अधिक डिलीमीटर की अनुमति है तो नौकरी लेकिन बोझिल हो जाती है। –

+0

मुझे लगता है कि हम एक ही प्रक्रिया का उपयोग कर सकते हैं और कोने के मामलों का ख्याल रखना चाहिए – router