अंततः, यह स्थान में उल्टा करने के लिए है, तो जैसे क्लीनर होगा:
#include <stdio.h>
#include <string.h>
void
reverse(char *s)
{
int a, b, c;
for (b = 0, c = strlen(s) - 1; b < c; b++, c--) {
a = s[b];
s[b] = s[c];
s[c] = a;
}
return;
}
int main(void)
{
char string[] = "hello";
printf("%s\n", string);
reverse(string);
printf("%s\n", string);
return 0;
}
आपका समाधान अनिवार्य रूप से इस एक का एक अर्थ की दृष्टि से बड़ा संस्करण है। एक सूचक और एक सरणी के बीच अंतर को समझें। मानक स्पष्ट रूप से बताता है कि इस तरह के एक ऑपरेशन का व्यवहार (एक स्ट्रिंग अक्षर की सामग्री का संशोधन) अनिर्धारित है। तुम भी एस्किमो से this अंश देखना चाहिए:
आप एक स्ट्रिंग निरंतर के साथ एक चरित्र सरणी को प्रारंभ करते समय:
char string[] = "Hello, world!";
आप एक सरणी स्ट्रिंग वाली के साथ खत्म हो, और आप के लिए सरणी की सामग्री को संशोधित कर सकते हैं अपने दिल की सामग्री:
string[0] = 'J';
हालांकि, आपके कोड में अन्य स्थानों पर स्ट्रिंग स्थिरांक (औपचारिक शब्द स्ट्रिंग अक्षर) का उपयोग करना संभव है। चूंकि वे सरणी हैं, इसलिए कंपाइलर पॉइंटर्स को उनके पहले तत्वों में उत्पन्न करता है जब वे सामान्य रूप से अभिव्यक्तियों में उपयोग किए जाते हैं। यही है, अगर आप कहते हैं कि
char *p1 = "Hello";
int len = strlen("world");
यह लगभग रूप में अगर आप ने कहा था है
char internal_string_1[] = "Hello";
char internal_string_2[] = "world";
char *p1 = &internal_string_1[0];
int len = strlen(&internal_string_2[0]);
यहाँ, सरणियों internal_string_1 नामित और internal_string_2 तथ्य यह है कि संकलक वास्तव में थोड़ा अस्थायी पैदा कर रहा है का सुझाव करने वाले हैं प्रत्येक बार जब आप अपने कोड में एक स्ट्रिंग स्थिर का उपयोग करते हैं तो सरणी। हालांकि, सूक्ष्म तथ्य यह है कि स्ट्रिंग स्थिरांक के पीछे वाले सरणी आवश्यक रूप से संशोधित नहीं हैं। विशेष रूप से, कंपाइलर उन्हें केवल-पढ़ने-मेमोरी में संग्रहीत कर सकता है। इसलिए, यदि आप लिखना
char *p3 = "Hello, world!";
p3[0] = 'J';
अपने कार्यक्रम, क्रैश हो सकता है, क्योंकि यह एक मूल्य के स्टोर करने के लिए कोशिश कर सकते हैं (इस मामले में, चरित्र 'जे') nonwritable स्मृति में।
नैतिक यह है कि जब भी आप तारों का निर्माण या संशोधन कर रहे हों, तो आपको यह सुनिश्चित करना होगा कि आप जो मेमोरी बना रहे हैं या उन्हें संशोधित कर रहे हैं वह लिखने योग्य है।वह स्मृति या तो आपके द्वारा आवंटित एक सरणी होनी चाहिए, या कुछ स्मृति जो आपने गतिशील रूप से उन तकनीकों द्वारा आवंटित की हैं जिन्हें हम अगले अध्याय में देखेंगे। सुनिश्चित करें कि आपके प्रोग्राम का कोई भी हिस्सा कभी भी एक स्ट्रिंग को संशोधित करने का प्रयास नहीं करेगा जो वास्तव में अज्ञात, अवांछित सरणी में से एक है जो आपके स्ट्रिंग स्थिरांक में से एक के जवाब में आपके लिए जेनरेट किया गया संकलक है। (एकमात्र अपवाद सरणी प्रारंभिकता है, क्योंकि यदि आप इस तरह के सरणी को लिखते हैं, तो आप सरणी को लिख रहे हैं, स्ट्रिंग अक्षर के लिए नहीं जिसे आपने सरणी को प्रारंभ करने के लिए उपयोग किया था।) "
भले ही आपके सवाल का जवाब लोगों को यह लगा बाहर है, तो आप कभी नहीं कहा कि क्या त्रुटि आप मिल रहे थे, या क्या काम नहीं कर रहा था! आपको हमेशा जो भी उम्मीद है, और जो आपने वास्तव में देखा है उसका वर्णन करना चाहिए। (गलत आउटपुट? Seg-fault/GPF त्रुटि? अनंत लूप/लटका?) – abelenky
यह एक segfault था। मुझे इसका उल्लेख करना चाहिए था, अनुस्मारक के लिए धन्यवाद। – qwer