दिलचस्प पोस्ट
कैसे एक वस्तु में आंतरिक वस्तुओं / संपत्ति पर पुनरावृत्त करने के लिए एक एकल वर्ण और ट्रिम स्ट्रिंग में सफेद स्थान के दृश्यों को संकुचित करें स्टेक ट्रेस को खोए बिना जावा में अपग्रेड करना अपवाद जावा डेडलॉक सवाल .NET 4.0 के लिए सी # 6.0 काम करता है? ES6 वेबपैक का उपयोग करके एक vue.js प्रोजेक्ट में ('@') साइन इन पथ पर उपयोग करके आयात करें AFNetworking और पृष्ठभूमि स्थानान्तरण इंस्टाल पर Greasemonkey स्क्रिप्ट में उपयोगकर्ता इनपुट संग्रहीत करना IEnumerable के संभावित बहु गणना के लिए चेतावनी संभालना iCloud मूल बातें और कोड नमूना पायथन में एक अस्थायी फीफा (नामित पाइप) बनाएँ? जावास्क्रिप्ट समापन तत्काल मूल्यांकन क्या एक जिन्जा चर का गुंजाइश एक आंतरिक ब्लॉक में फैल सकता है? "तत्काल" और "आरंभ" के बीच क्या अंतर है? केवल मानक पुस्तकालय का उपयोग करते हुए गठबंधन मेमोरी आवंटित करने के लिए कैसे?

नेस्टेड स्ट्रॉटोक फ़ंक्शन समस्या सी

मेरे पास इस तरह की स्ट्रिंग है:

a;b;c;d;e f;g;h;i;j 1;2;3;4;5 

और मैं तत्व द्वारा तत्व को पार्स करना चाहता हूं। मैंने नेस्टेड स्ट्र्टोक फ़ंक्शन का इस्तेमाल किया लेकिन यह केवल पहली पंक्ति को विभाजित करता है और टोकन सूचक को रिक्त करता है मैं इससे कैसे उबरूं? यहां कोड है:

 token = strtok(str, "\n"); while(token != NULL && *token != EOF) { char a[128], b[128]; strcpy(a,token); strcpy(b,a); printf("a:%s\n",a); char *token2 = strtok(a,";"); while(token2 != NULL) { printf("token2 %s\n",token2); token2 = strtok(NULL,";"); } strcpy(token,b); token = strtok(NULL, "\n"); if(token == NULL) { printf("its null"); } } 

आउटपुट:

 token 2 a token 2 b token 2 c token 2 d token 2 e 

वेब के समाधान से एकत्रित समाधान "नेस्टेड स्ट्रॉटोक फ़ंक्शन समस्या सी"

आप ऐसा नहीं कर सकते strtok() ; Microsoft से POSIX या strtok_s() से strtok_r() उपयोग करें यदि वे उपलब्ध हैं, या अपने डिज़ाइन पर पुनर्विचार करें

 char *strtok_r(char *restrict s, const char *restrict sep, char **restrict lasts); char *strtok_s(char *strToken, const char *strDelimit, char **context); 

ये दो कार्य विनिमेय हैं हालांकि strtok_s() 9899: 2011 का अनुलग्नक के सी का एक वैकल्पिक हिस्सा है, यद्यपि strtok_s() ने मानक के उस भाग में इंटरफेस को लागू किया है।

Strtok_r () के साथ

 #include <string.h> #include <stdio.h> int main(void) { char str[] = "a;b;c;d;e\nf;g;h;i;j\n1;2;3;4;5\n"; char *end_str; char *token = strtok_r(str, "\n", &end_str); while (token != NULL) { char *end_token; printf("a = %s\n", token); char *token2 = strtok_r(token, ";", &end_token); while (token2 != NULL) { printf("b = %s\n", token2); token2 = strtok_r(NULL, ";", &end_token); } token = strtok_r(NULL, "\n", &end_str); } return 0; } 

परिणाम

 a = a;b;c;d;e b = a b = b b = c b = d b = e a = f;g;h;i;j b = f b = g b = h b = i b = j a = 1;2;3;4;5 b = 1 b = 2 b = 3 b = 4 b = 5 

बिना strtok_r ()

यह संदर्भ में काम करता है – बशर्ते डेटा एक नई लाइन के साथ समाप्त होता है

 #include <string.h> #include <stdio.h> int main(void) { char data[] = "a;b;c;d;e\nf;g;h;i;j\n1;2;3;4;5\n"; char *string = data; char *token = strchr(string, '\n'); while (token != NULL) { /* String to scan is in string..token */ *token++ = '\0'; printf("a = %s\n", string); char *token2 = strtok(string, ";"); while (token2 != NULL) { printf("b = %s\n", token2); token2 = strtok(NULL, ";"); } string = token; token = strchr(string, '\n'); } return 0; } 

उत्पादन

 a = a;b;c;d;e b = a b = b b = c b = d b = e a = f;g;h;i;j b = f b = g b = h b = i b = j a = 1;2;3;4;5 b = 1 b = 2 b = 3 b = 4 b = 5 

strtok_r सबसे अच्छा और सबसे सुरक्षित समाधान है, लेकिन यह भी एक तरीका है जो strtok साथ strtok :

 #include <string.h> #include <stdio.h> int main () { char str[] = "a;b;c;d;e\nf;g;h;i;j\n1;2;3;4;5\n"; char *line; char *token; char buf[256]; for (line = strtok (str, "\n"); line != NULL; line = strtok (line + strlen (line) + 1, "\n")) { strncpy (buf, line, sizeof (buf)); printf ("Line: %s\n", buf); for (token = strtok (buf, ";"); token != NULL; token = strtok (token + strlen (token) + 1, ";")) { printf ("\tToken: %s\n", token); } } return 0; } 

आउटपुट:

 Line: a;b;c;d;e Token: a Token: b Token: c Token: d Token: e Line: f;g;h;i;j Token: f Token: g Token: h Token: i Token: j Line: 1;2;3;4;5 Token: 1 Token: 2 Token: 3 Token: 4 Token: 5