मैंने सी में फ़ंक्शन को प्रतिस्थापित करने की कोशिश की है, जो char *
पर काम करता है, जिसे malloc()
का उपयोग करके आवंटित किया गया है। यह थोड़ा अलग है कि यह प्रारंभिक स्ट्रिंग में वर्णों की बजाय तारों को ढूंढ और प्रतिस्थापित करेगा।मुझे realloc() के साथ दोहरी मुक्त त्रुटि क्यों मिल रही है?
यदि खोज और प्रतिस्थापन स्ट्रिंग एक ही लम्बाई है (या प्रतिस्थापन स्ट्रिंग खोज स्ट्रिंग से छोटा है), क्योंकि मेरे पास आवंटित पर्याप्त स्थान है, तो यह करना मुश्किल है। अगर मैं realloc()
का उपयोग करने का प्रयास करता हूं, तो मुझे एक त्रुटि मिलती है जो मुझे बताती है कि मैं एक डबल फ्री कर रहा हूं - जो मुझे नहीं लगता कि मैं कैसे हूं, क्योंकि मैं केवल realloc()
का उपयोग कर रहा हूं।
शायद एक छोटे से कोड में मदद मिलेगी:
void strrep(char *input, char *search, char *replace) {
int searchLen = strlen(search);
int replaceLen = strlen(replace);
int delta = replaceLen - searchLen;
char *find = input;
while (find = strstr(find, search)) {
if (delta > 0) {
realloc(input, strlen(input) + delta);
find = strstr(input, search);
}
memmove(find + replaceLen, find + searchLen, strlen(input) - (find - input));
memmove(find, replace, replaceLen);
}
}
कार्यक्रम काम करता है, जब तक मैं एक उदाहरण जहां प्रतिस्थापित स्ट्रिंग प्रारंभिक स्ट्रिंग से अधिक समय हो जाएगा में realloc()
की कोशिश करो। (यह अभी भी काम करता है, यह सिर्फ त्रुटियों के साथ-साथ परिणाम भी थूकता है)।
यदि यह मदद करता है, बुला कोड लगता है:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void strrep(char *input, char *search, char *replace);
int main(void) {
char *input = malloc(81);
while ((fgets(input, 81, stdin)) != NULL) {
strrep(input, "Noel", "Christmas");
}
}
और यदि रीयलॉक विफल रहता है, तो यह न्यूल लौटाता है, और मौजूदा बफर को अकेला छोड़ देता है। आपने अभी पॉइंटर खो दिया है ... :-( –