2012-02-05 13 views
9

के व्यक्तिगत वर्ण तत्व को बदलें, मैं सी पर वास्तव में कुछ मूल करने की कोशिश कर रहा हूं लेकिन मुझे सेगमेंटेशन गलती मिल रही है। मैं बस इतना करना चाहता हूं कि एक शब्द के एक अक्षर को एक अलग अक्षर से प्रतिस्थापित करें- इस उदाहरण में एल को एल के साथ प्रतिस्थापित करें। क्या कोई यह समझाने में मदद कर सकता है कि मैं गलत कहां गया हूं? यह वास्तव में एक मूलभूत समस्या होनी चाहिए जो मुझे लगता है, मुझे नहीं पता कि यह क्यों काम नहीं कर रहा है।स्ट्रिंग सी

#include<stdio.h> 
#include<stdlib.h> 

int main(int argc, char *argv[]) 
{ 
    char *string1; 

    string1 = "hello"; 
    printf("string1 %s\n", string1);  

    printf("string1[2] %c\n", string1[2]); 
    string1[2] = 'L'; 
    printf("string1 %s\n", string1); 

    return 0; 
} 

मेरी उत्पादन के लिए मैं मिल

string1 हैलो
string1 [2] एल
विभाजन गलती

धन्यवाद!

+0

स्ट्रिंग 1 केवल पढ़ने योग्य स्मृति (अधिकांश प्रणालियों में) के लिए एक सूचक है क्योंकि यह निरंतर प्रारंभकर्ता है। आप उस स्ट्रिंग को पहले कॉपी किए बिना लिख ​​नहीं सकते हैं। – gaige

उत्तर

14
string1 = "hello"; 
string1[2] = 'L'; 

आप can't change string literals, यह अपरिभाषित व्यवहार है। इस प्रयास करें:

char string1[] = "hello"; 

या हो सकता है: एक स्ट्रिंग के लिए

char *string1; 
string1 = malloc(6); /* hello + 0-terminator */ 
strcpy(string1, "hello"); 

/* Stuff. */ 

free(string1); 
+0

ठीक है- धन्यवाद! मैं इसे एक दूंगा। – user1163974

+0

कुछ भी बड़ा नहीं है लेकिन आप malloc और strcpy के कॉल के बजाय strdup ("हैलो") का उपयोग कर सकते हैं। strdup यह आपके लिए करता है, – Zoneur

+0

@Zoneur Yup का उपयोग करना अधिक सुविधाजनक है, मैं अक्सर 'strdup' की अनुशंसा करता हूं लेकिन यह कभी-कभी समस्याग्रस्त है क्योंकि यह मानक नहीं है। – cnicutar

3
char *string1; 
string1 = "hello"; 

string1 अंक शाब्दिक और स्ट्रिंग शाब्दिक गैर परिवर्तनीय हैं।

आप क्या कर सकते हैं एक स्ट्रिंग अक्षर के तत्वों के साथ एक सरणी शुरू करना है।

char string1[] = "hello"; 

string1 सरणी के तत्व संशोधित हैं।

0
string1[2] = 'L'; 

आप एक स्ट्रिंग शाब्दिक बदलने के लिए जो सी में अपरिभाषित व्यवहार के बजाय का उपयोग करें कोशिश कर रहे हैं string1[]="hello"; विभाजन गलती आप प्राप्त है, क्योंकि शाब्दिक शायद केवल पढ़ने के लिए स्मृति की धारा में जमा हो जाती है और करने के लिए कोशिश कर रहा है इसे लिखना अपरिभाषित व्यवहार पैदा करता है।

1
char *string1 = "hello"; 

कोड चलाते समय, स्ट्रिंग अक्षर केवल एक अनुभाग में होगा जो केवल पढ़ने के लिए होगा। ओएस कोड को स्मृति के उस ब्लॉक को बदलने की अनुमति नहीं देता है, इसलिए आपको सीजी-गलती मिलती है।

char string1[] = "hello"; 

स्ट्रिंग अक्षर को कोड चलाने पर स्टैक पर धक्का दिया जाएगा।

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