सी में शुरुआती के लिए अन्य उत्तरों को देखते हुए, यह कोड के कड़े आकार के कारण जटिल लगेगा, मैंने सोचा था कि मैं इसे शुरुआती के लिए रखूंगा, वास्तव में स्ट्रिंग को पार्स करना आसान हो सकता है इस तरह strtok
का उपयोग कर ... कुछ:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
char **parseInput(const char *str, int *nLen);
void resizeptr(char ***, int nLen);
int main(int argc, char **argv){
int maxLen = 0;
int i = 0;
char **ptr = NULL;
char *str = "valgrind --leak-check=yes --track-origins=yes ./a.out";
ptr = parseInput(str, &maxLen);
if (!ptr) printf("Error!\n");
else{
for (i = 0; i < maxLen; i++) printf("%s\n", ptr[i]);
}
for (i = 0; i < maxLen; i++) free(ptr[i]);
free(ptr);
return 0;
}
char **parseInput(const char *str, int *Index){
char **pStr = NULL;
char *ptr = (char *)str;
int charPos = 0, indx = 0;
while (ptr++ && *ptr){
if (!isspace(*ptr) && *ptr) charPos++;
else{
resizeptr(&ptr, ++indx);
pStr[indx-1] = (char *)malloc(((charPos+1) * sizeof(char))+1);
if (!pStr[indx-1]) return NULL;
strncpy(pStr[indx-1], ptr - (charPos+1), charPos+1);
pStr[indx-1][charPos+1]='\0';
charPos = 0;
}
}
if (charPos > 0){
resizeptr(&pStr, ++indx);
pStr[indx-1] = (char *)malloc(((charPos+1) * sizeof(char))+1);
if (!pStr[indx-1]) return NULL;
strncpy(pStr[indx-1], ptr - (charPos+1), charPos+1);
pStr[indx-1][charPos+1]='\0';
}
*Index = indx;
return (char **)pStr;
}
void resizeptr(char ***ptr, int nLen){
if (*(ptr) == (char **)NULL){
*(ptr) = (char **)malloc(nLen * sizeof(char*));
if (!*(ptr)) perror("error!");
}else{
char **tmp = (char **)realloc(*(ptr),nLen);
if (!tmp) perror("error!");
*(ptr) = tmp;
}
}
मैं थोड़ा यह आसान बनाने के लिए कोड को संशोधित किया। एकमात्र स्ट्रिंग फ़ंक्शन जिसका मैंने उपयोग किया था strncpy
था ..सुनिश्चित करें कि यह थोड़ा लंबा हवादार है लेकिन यह हार्ड-कोडित MAX_ARGS का उपयोग करने के बजाय गतिशील रूप से तारों की सरणी को पुन: आवंटित करता है, जिसका अर्थ है कि डबल पॉइंटर पहले से ही 3 या 4 करने पर स्मृति को गले लगा रहा है, जो भी करेगा स्मृति उपयोग कुशल और छोटे, realloc
का उपयोग करके, सरल पार्सिंग isspace
को नियोजित करके कवर किया जाता है, क्योंकि यह सूचक का उपयोग करता है। जब कोई स्थान सामने आ जाता है, तो यह realloc
डबल पॉइंटर को एट करता है, और malloc
स्ट्रिंग को पकड़ने के लिए ऑफ़सेट होता है।
सूचना कैसे ट्रिपल संकेत resizeptr
समारोह में किया जाता है .. वास्तव में, मैंने सोचा था कि यह एक सरल सी कार्यक्रम, संकेत, realloc, malloc का एक उत्कृष्ट उदाहरण में काम करेगा, गुजर-संदर्भ द्वारा, पार्स के बुनियादी तत्व एक स्ट्रिंग ...
उम्मीद है कि यह मदद करता है, सर्वश्रेष्ठ संबंध, टॉम।
@ स्नीश: यह एक उत्कृष्ट उदाहरण है कि आप इसे सी में कैसे कर सकते हैं क्योंकि पुरानी कहावत है कि 'बिल्ली को त्वचा के कई तरीके हैं ...' +1। – t0mm13b