2010-11-28 18 views
13

क्या कोई मेरी मदद कर सकता है? मैं सीसी-स्ट्रिंग से पहले अक्षर को कैसे हटाया जाए?

उदाहरण के लिए में एक char * से पहले चरित्र को दूर करने की जरूरत है, char * contents सरणी में पहले वर्ण के रूप में एक '\n' वर्ण है। मुझे इस चरित्र को पहचानने और खत्म करने की आवश्यकता है, मूल वैरिएबल को "sanitized" के बाद संशोधित करना है।

क्या कोई मुझे कोड के साथ मदद कर सकता है? मैं सी के लिए बिल्कुल नया हूं, और इसे समझने के लिए प्रतीत नहीं होता है।

+1

एक सी नौसिखिया के लिए है, यह बहुत 'के बारे में पढ़ने के लिए फायदेमंद है सूचक अंकगणित '। Google शब्द, आपको कई हिट मिलेगी। यह समझने में मदद करेगा कि दूसरों के बारे में क्या बात कर रहे हैं। उदाहरण के लिए: 'char * content_chopped = content + 1;'। – biocyberman

उत्तर

41
if (contents[0] == '\n') 
    memmove(contents, contents+1, strlen(contents)); 

या, यदि सूचक संशोधित किया जा सकता है:

if (contents[0] == '\n') contents++; 
+2

+1 मुझे इसे हराया। –

+1

आह, यह है कि 'mem' फ़ंक्शन स्ट्रिंग्स में क्या करते हैं। कूल। वह पहला सुझाव पूरी तरह से काम करता है! – Ash

+3

और ध्यान दें कि आपको 'memmove' का उपयोग करने की आवश्यकता है, न कि 'memcpy', क्योंकि' memmove' को ओवरलैपिंग स्रोत/गंतव्य को सही तरीके से संभालने के लिए आवश्यक है। –

19

char* contents_chopped = contents + 1;

यह वही स्ट्रिंग की ओर इशारा करते contents_chopped में परिणाम होगा, पहले चार को छोड़कर \ N के बाद अगले हो जाएगा

इसके अलावा, यह विधि तेज है।

+0

ध्यान दें कि सूचक वैधता 'सामग्री' की वैधता पर निर्भर करेगी, इसलिए यह अच्छा है अगर आप केवल 'content_chopped' पर कुछ त्वरित प्रक्रिया करना चाहते हैं। खाली स्ट्रिंग की जांच करने की भी आवश्यकता है। – tia

+0

+1 उत्तर देने के लिए कि किसी वास्तविक दुनिया कोड का उपयोग करना चाहिए। अपनी पूंछ का उपयोग करने के लिए सिर्फ एक संपूर्ण स्ट्रिंग को कॉपी/ले जाना समय की हास्यास्पद बर्बादी है, लेकिन ऐसे कई प्रोग्राम हैं जो वास्तव में ऐसी चीजें करते हैं ... –

+0

मुझे यह कितना आसान लगता है लेकिन आप content_chopped को मुक्त नहीं कर सकते हैं, इसकी जरूरत है। –

3

ऐसा लगता है कि आप इस धारणा के तहत हैं कि एक char * "शामिल" वर्ण हैं। ऐसा नहीं होता। यह केवल अंक बाइट पर। शेष स्ट्रिंग को अगली नल बाइट तक मेमोरी में बाद के बाइट को शामिल करने के लिए निहित किया गया है। (आपको यह भी पता होना चाहिए कि हालांकि 'चार' डेटा प्रकार एक बाइट है, परिभाषा के अनुसार, यह वास्तव में एक चरित्र नहीं है - कृपया यूनिकोड से अवगत रहें - और न ही बाइट जरूरी एक ऑक्टेट है।)

char * एक सरणी नहीं है, या तो, हालांकि वर्णों की एक सरणी मौजूद हो सकती है जैसे कि सूचक उस सरणी की शुरुआत को इंगित कर रहा है।

13

अगर आपने कोई स्मृति या आपका प्रोग्राम क्रैश किया है तो सूचक को केवल वृद्धि न करें। मुफ्त मूल सूचक की जरूरत है। आप पॉइंटर की प्रतिलिपि बना सकते हैं, मेमोरी का एक नया हिस्सा बना सकते हैं और इसे याद कर सकते हैं, इसे पीआरटी + 1 या अन्य तरीकों के समूह के रूप में एक्सेस कर सकते हैं, लेकिन जो लोग कहते हैं कि पॉइंटर बढ़ाना आपको खतरनाक सलाह दे रहा है। आप इस नमूना कार्यक्रम को चला सकते हैं और देख सकते हैं कि जब आप "सूचक को बढ़ाते हैं" तो क्या होता है।

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
int main(void) 
{ 
    char *str = (char *)malloc(10); 
    strcpy(str, "1234567890"); 
    printf("%s\n", str); 
    str++; 
    printf("%s\n", str); 
    free(str); 
} 

सुझाव: यहाँ परिणाम है:

[[email protected] ~]$ ./foo 
1234567890 
234567890 
*** glibc detected *** ./foo: free(): invalid pointer: 0x08c65009 *** 
======= Backtrace: ========= 
/lib/tls/i686/cmov/libc.so.6(+0x6b591)[0x724591] 
/lib/tls/i686/cmov/libc.so.6(+0x6cde8)[0x725de8] 
/lib/tls/i686/cmov/libc.so.6(cfree+0x6d)[0x728ecd] 
./foo[0x80484e3] 
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0x6cfbd6] 
./foo[0x80483f1] 
======= Memory map: ======== 
001c9000-001e4000 r-xp 00000000 08:01 2883609 /lib/ld-2.11.1.so 
001e4000-001e5000 r--p 0001a000 08:01 2883609 /lib/ld-2.11.1.so 
001e5000-001e6000 rw-p 0001b000 08:01 2883609 /lib/ld-2.11.1.so 
006b9000-0080c000 r-xp 00000000 08:01 3015690 /lib/tls/i686/cmov/libc-2.11.1.so 
0080c000-0080d000 ---p 00153000 08:01 3015690 /lib/tls/i686/cmov/libc-2.11.1.so 
0080d000-0080f000 r--p 00153000 08:01 3015690 /lib/tls/i686/cmov/libc-2.11.1.so 
0080f000-00810000 rw-p 00155000 08:01 3015690 /lib/tls/i686/cmov/libc-2.11.1.so 
00810000-00813000 rw-p 00000000 00:00 0 
00e4d000-00e4e000 r-xp 00000000 00:00 0   [vdso] 
00fe0000-00ffd000 r-xp 00000000 08:01 2883667 /lib/libgcc_s.so.1 
00ffd000-00ffe000 r--p 0001c000 08:01 2883667 /lib/libgcc_s.so.1 
00ffe000-00fff000 rw-p 0001d000 08:01 2883667 /lib/libgcc_s.so.1 
08048000-08049000 r-xp 00000000 08:01 9700477 /home/mfisch/foo 
08049000-0804a000 r--p 00000000 08:01 9700477 /home/mfisch/foo 
0804a000-0804b000 rw-p 00001000 08:01 9700477 /home/mfisch/foo 
08c65000-08c86000 rw-p 00000000 00:00 0   [heap] 
b7600000-b7621000 rw-p 00000000 00:00 0 
b7621000-b7700000 ---p 00000000 00:00 0 
b776f000-b7770000 rw-p 00000000 00:00 0 
b7780000-b7783000 rw-p 00000000 00:00 0 
bfc22000-bfc37000 rw-p 00000000 00:00 0   [stack] 
Aborted 
+2

अच्छा बिंदु, यह अभी मेरे साथ हो रहा है क्योंकि मैं वृद्धि विधि का उपयोग कर रहा हूं, मैं यहां जो भी दिखाता हूं उसमें एक समान त्रुटि भी देख रहा हूं। इस उत्तर के साथ एकमात्र समस्या है, कोई कोड समाधान नहीं है। –

-1

यहाँ मेरी कोड

char * bastakiniSil(char *contents){ 
char *p = malloc(sizeof(*p) * strlen(contents)); 
int i; 
for(i=0; i<strlen(contents); i++) 
{ 
    p[i]=contents[i+1]; 
} 

return p; 

}