string - Extract the file name and its extension in C -


तो हमारे पास पथ स्ट्रिंग /home/user/music/thomas.mp3 है।

फ़ाइल स्ट्रिंग निकालने का आसान तरीका कहां से है (एक्सटेंशन के बिना, "थॉमस") और इसका एक्सटेंशन ("एमपी 3") इस स्ट्रिंग से है? फ़ाइल नाम के लिए एक फ़ंक्शन, और विस्तार के लिए। और हमारे हाथों में केवल जीएनयू लिबसी।


  #include & lt; stdio.h & gt; # शामिल करें & lt; stdlib.h & gt; #include & lt; string.h & gt; #define MAX_FILENAME_SIZE 256 char * filename (char * str) {char * परिणाम; चार * अंतिम; अगर ((अंतिम = strrchr (str, '।'))! = नल) {if ((* last == '।') & Amp; amp; amp; & amp; (अंतिम == str)) वापसी str; Else {परिणाम = (चार *) मॉलोक (MAX_FILENAME_SIZE); Snprintf (परिणाम, आकार के परिणाम, "%। * S", (int) (अंतिम - str), str); वापसी परिणाम; }} और {वापसी str; }} Char * extname (char * str) {char * परिणाम; चार * अंतिम; अगर ((अंतिम = स्ट्र्रर्चर (str, '।'))! = नल) {if ((* last == '।') & Amp; amp; amp; (अंतिम == str)) "" वापसी; Else {परिणाम = (चार *) मॉलोक (MAX_FILENAME_SIZE); Snprintf (परिणाम, आकार परिणाम, "% s", अंतिम + 1); वापसी परिणाम; }} और {वापसी ""; // खाली / नल स्ट्रिंग}}  

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

सबसे पहले:

  strncpy (str, परिणाम, (size_t) (अंतिम-str) + 1);  

अच्छा नहीं है आपके पास dest और src गलत तरीके से है; और आगे यह फ़ंक्शन निर्गम को समाप्त नहीं करता है (जब तक इनपुट पर्याप्त कम नहीं है, जो कि यह नहीं है)। आम तौर पर strncpy बोलने से लगभग एक समस्या का कोई अच्छा समाधान नहीं होता है; या तो strcpy यदि आप लंबाई, या snprintf जानते हैं।

सरल और कम त्रुटि प्रवण होगा:

  Snprintf (परिणाम, आकार के परिणाम, "%। * S", (int) (अंतिम - str), str);  

अन्य फ़ंक्शन में समानता,

  snprintf (परिणाम, आकार परिणाम, "% s", अंतिम + 1);  

snprintf फ़ंक्शन बफ़र ओवरफ्लो नहीं करता और हमेशा एक निरर्थक स्ट्रिंग उत्पन्न करता है, जब तक कि आप बफर की लंबाई सही मानते हैं!

अब, भले ही आपने उनको तय किया हो, फिर भी आपको एक और मौलिक समस्या है कि आप एक बफर को वापस करने के लिए एक पॉइंटर लौट रहे हैं जो फ़ंक्शन रिटर्न के बाद नष्ट हो जाता है। आप ext को सिर्फ पिछले + 1 वापस कर सकते हैं, चूंकि यह किसी भी तरह समाप्त नहीं है। लेकिन फ़ाइल नाम के लिए आपके पास सामान्य विकल्प हैं:

  • एक सूचक और एक लंबाई लौटाओ और इसे एक लम्बी-गिनती वाली स्ट्रिंग के रूप में मानें, नल-टर्मिनेटेड नहीं एक
  • malloc ated स्मृति पर वापसी पॉइंटर
  • स्थिर बफर पर वापसी पॉइंटर
  • कॉलर को बफर में पास करने की उम्मीद है और बफर लंबाई, जिसे आप बस में लिखते हैं

अंत में, विफलता पर NULL लौटना शायद एक बुरा विचार है; अगर कोई नहीं है। तब फ़ाइलनाम के लिए पूरी स्ट्रिंग लौटाएं, और ext के लिए एक रिक्त स्ट्रिंग लौटें इसके बाद कॉलिंग कोड को NULL के लिए चेक के साथ खुद को संगृहीत नहीं करना पड़ता है।


Comments

Popular posts from this blog

c++ - C/pp Sockets, recv()/send() works only under gdb -

GO: Serve static pages -

objective c - How to open front/back camera at the same time in iOS developing? -