2009-11-13 10 views
24

से पहला और अंतिम अक्षर स्ट्रिप करें मेरे पास एक सी स्ट्रिंग है जो "Nmy stringP" जैसा दिखती है, जहां एन और पी कोई चरित्र हो सकता है। मैं इसे सी में "my string" में कैसे संपादित कर सकता हूं?सी स्ट्रिंग

+2

गृहकार्य? यदि यह है तो "होमवर्क" टैग जोड़ें। – pmg

+0

नहीं, होमवर्क नहीं - बस मज़ा के लिए सी सीखने की कोशिश कर रहा है। – igul222

+1

शुद्ध सी में "स्ट्रिंग" जैसी कोई चीज़ नहीं है। क्या आपके पास बफर ('char *') या एक वर्ण सरणी ('char []') के लिए पॉइंटर है? –

उत्तर

46

दूसरे चरित्र के लिए 1 चरित्र बिंदु "निकालें" करने के लिए:

char mystr[] = "Nmy stringP"; 
char *p = mystr; 
p++; /* 'N' is not in `p` */ 

अंतिम वर्ण को निकालने के लिए एक '\ 0' से बदलने

p[strlen(p)-1] = 0; /* 'P' is not in `p` (and it isn't in `mystr` either) */ 
+3

यह काम नहीं कर सकता है क्योंकि "निमी स्ट्रिंगपी" को शाब्दिक रूप से प्रारंभ करके, कंपाइलर/लिंकर इसे केवल स्मृति में ही रख सकता है, जिससे संपादन विफल हो जाता है। – Suppressingfire

+8

@Suppressingfire: "नेमी स्ट्रिंगपी" वास्तव में एक शाब्दिक स्ट्रिंग है, लेकिन इसकी प्रतिलिपि बनाई गई है (char द्वारा char) सरणी 'mystr' में। सरणी 'mystr' संशोधित है। – pmg

+0

@ अपराह्न: आप कहां कॉपी कर रहे हैं? 'char * p = mystr' अंक' p' 'mystr' पर, यह 'mystr' की प्रतिलिपि नहीं करता है। – quark

1

लिए सबसे कारगर तरीका:

//Note destroys the original string by removing it's last char 
// Do not pass in a string literal. 
char * getAllButFirstAndLast(char *input) 
{ 
    int len = strlen(input); 
    if(len > 0) 
    input++;//Go past the first char 
    if(len > 1) 
    input[len - 2] = '\0';//Replace the last char with a null termination 
    return input; 
} 


//... 
//Call it like so 
char str[512]; 
strcpy(str, "hello world"); 
char *pMod = getAllButFirstAndLast(str); 

सबसे सुरक्षित तरीका:

void getAllButFirstAndLast(const char *input, char *output) 
{ 
    int len = strlen(input); 
    if(len > 0) 
    strcpy(output, ++input); 
    if(len > 1) 
    output[len - 2] = '\0'; 
} 


//... 
//Call it like so 
char mod[512]; 
getAllButFirstAndLast("hello world", mod); 

दूसरा तरीका कम कुशल है लेकिन यह सुरक्षित है क्योंकि आप स्ट्रिंग अक्षर में इनपुट में पास कर सकते हैं। यदि आप इसे स्वयं लागू नहीं करना चाहते हैं तो आप दूसरे तरीके से स्ट्रड का भी उपयोग कर सकते हैं।

+0

समस्या जो मैं आपके दूसरे कार्यान्वयन के साथ देखता हूं वह यह है कि आपको यह सुनिश्चित करना होगा कि आपका आउटपुट पर्याप्त बड़ा हो आपको कॉल करने से पहले कॉपी को संभालने के लिए AllBufFirstAndLast()। इस मामले में, मैं कॉल में आउटपुट लम्बाई वैरिएबल जोड़ने की सलाह दूंगा और कॉल किए गए फ़ंक्शन को strn * फ़ंक्शंस के साथ आउटपुट का उपयोग करने दें। – shank

+0

हाँ यह एक पूर्व शर्त है, हाँ आप एक लंबाई पैरामीटर जोड़ सकते हैं। –

9

एक अन्य विकल्प, फिर यह सोचते हैं "संपादित करें" का मतलब है कि आप जगह में बदलाव करना चाहते हैं:

void topntail(char *str) { 
    size_t len = strlen(str); 
    assert(len >= 2); // or whatever you want to do with short strings 
    memmove(str, str+1, len-2); 
    str[len-2] = 0; 
} 

इस जगह में स्ट्रिंग को संशोधित करता है, एक नया पता पैदा करने के रूप में पीएमजी के समाधान करता है बिना। ऐसा नहीं है कि पीएमजी के जवाब में कुछ भी गलत है, लेकिन कुछ मामलों में यह वही नहीं है जो आप चाहते हैं।

2
@ पीएमजी के जवाब देने के लिए

इसके अलावा, ध्यान दें कि आप एक बयान में दोनों कार्य कर सकते हैं:

char mystr[] = "Nmy stringP"; 
char *p = mystr; 
p++[strlen(p)-1] = 0; 

यह संभावना काम करेंगे की उम्मीद है, लेकिन व्यवहार सी मानक में अपरिभाषित है के रूप में।

+0

यह सबसे अच्छा है हालांकि अपरिभाषित व्यवहार पर भरोसा नहीं करना है। – T0xicCode

+1

@ xav0989 सहमत हुए, मैं एक टिप्पणी के रूप में इसे और अधिक जोड़ने का कारण (इसे करने के कारण को हाइलाइट करने के लिए), वैकल्पिक जवाब के रूप में नहीं। मैं इस पर थोड़ा नया हूँ। –

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