2012-02-23 16 views
12

ठीक है, इसलिए मैं समझता हूं कि स्ट्रोकोक अपने इनपुट तर्क को संशोधित करता है, लेकिन इस मामले में, यह इनपुट स्ट्रिंग को केवल पहले टोकन में ढह रहा है। यह क्यों हो रहा है, और मैं इसे ठीक करने के लिए क्या कर सकता हूं? (कृपया ध्यान दें, मैं चर "अस्थायी" के बारे में बात नहीं कर रहा हूँ, जो पहले टोकन होना चाहिए, बल्कि चर "इनपुट" है, जो एक कॉल के बाद strtok हो जाता है "इस")स्ट्रोकोक इस तरह अपना इनपुट क्यों बदल रहा है?

#include <string.h> 
#include <stdlib.h> 
#include <stdio.h> 

int main(int argc, char* argv[]) { 
    char input[]="this is a test of the tokenizor seven"; 
    char * temp; 
    temp=strtok(input," "); 
    printf("input: %s\n", input); //input is now just "this" 
} 

उत्तर

24

जब strtok() टोकन पाता है, तो यह \0 में टोकन के तुरंत बाद चरित्र को बदलता है, और फिर टोकन में एक सूचक देता है। अगली बार जब आप इसे NULL तर्क के साथ बुलाते हैं, तो यह \0 के बाद, और संभवतः आगे के साथ, पहले टोकन को समाप्त करने वाले विभाजकों की देखभाल करना शुरू कर देता है।

अब, स्ट्रिंग की शुरुआत करने के लिए मूल सूचक अभी भी स्ट्रिंग की शुरुआत की ओर इशारा करता है, लेकिन पहले टोकन अब \0 -terminated है - यानी, printf() सोचता है कि टोकन के अंत स्ट्रिंग के अंत है । शेष डेटा अभी भी वहां है, लेकिन \0 इसे दिखाए जाने से printf() रोकता है। यदि आपने मूल इनपुट स्ट्रिंग पर मूल इनपुट स्ट्रिंग पर चलने के लिए for -loop का उपयोग किया है, तो आप पाएंगे कि डेटा अभी भी वहां है।

+1

ओह मैं देखता हूँ। स्ट्रैटोक काम कैसे करता है, इसकी मेरी समझ दूर थी - मैंने माना कि यह टोकन को बंद कर दिया गया था और फिर डिलिमीटर के बाद इनपुट पॉइंटर को पहले वर्ण में फिसल गया था। किसी भी दर पर, धन्यवाद! यह एक बहुत स्पष्ट और सहायक उत्तर था। – user1209326

+0

वह प्रबुद्ध था, धन्यवाद। –

2

ऐसा इसलिए है क्योंकि स्ट्रेटोक प्रत्येक विभाजक में नल डालता है, यही कारण है कि आप प्रत्येक टोकन प्राप्त करने के लिए स्ट्रोक को बार-बार कॉल का उपयोग करते हैं। स्ट्रेटोक का उपयोग शुरू करने के बाद इनपुट स्ट्रिंग का उपयोग नहीं किया जा सकता है। आप इसे "ठीक नहीं" करते हैं - इस तरह यह काम करता है।

+0

इस तरह की त्वरित प्रतिक्रिया के लिए धन्यवाद। बेशक जब मैंने कहा "इसे ठीक करें" मेरा मतलब था "मैं जो परिणाम चाहता हूं उसे प्राप्त करूं," लेकिन मैं आपकी मदद करने के लिए समय निकालने की सराहना करता हूं। – user1209326

+0

यदि आपको इनपुट स्ट्रिंग की एक अप्रभावित प्रति की आवश्यकता है, तो आपको स्ट्रेटोक से पहले इसकी प्रतिलिपि बनाना होगा। – Joe

3

आपको strtok से प्राप्त टोकन मुद्रित करना चाहिए और इनपुट सरणी के बारे में चिंता न करें क्योंकि NULLs strtok द्वारा डाले जाएंगे। सभी टोकन प्राप्त करने के लिए आपको बार-बार कॉल की आवश्यकता है:

#include <string.h> 
#include <stdlib.h> 
#include <stdio.h> 

int main(int argc, char* argv[]) { 
    char input[]="this is a test of the tokenizor seven"; 
    char * temp; 
    temp=strtok(input," "); 
    while(temp != NULL) { 
    printf("temp is \"%s\"\n", temp); 
    temp = strtok(NULL, " "); 
    } 
} 
+0

जैसा कि मैंने उपरोक्त कहा था, स्पष्ट रूप से मुझे गलत विचार था कि वास्तव में स्ट्रोक वास्तव में कैसे काम करता है। आपकी सहायताके लिए धन्यवाद! – user1209326

संबंधित मुद्दे