2012-12-03 14 views
18

मैं "स्ट्रिंग चार करने के लिए * शाब्दिक से रूपांतरण अब मान्य नहीं है" त्रुटि प्राप्त हो रही मेरी कोड में। कोड का उद्देश्य स्ट्रिंग 1 और स्ट्रिंग 2 को असाइन करने के लिए पॉइंटर-टू-पॉइंटर का उपयोग करना है, फिर इसे प्रिंट करें। मैं इसे कैसे ठीक करूं?रूपांतरण बहिष्कृत है

#include <iostream> 
using namespace std; 

struct WORDBLOCK 
{ 
    char* string1; 
    char* string2; 
}; 

void f3() 
{ 
    WORDBLOCK word; 

    word.string1 = "Test1"; 
    word.string2 = "Test2"; 


    char *test1 = word.string1; 
    char *test2 = word.string2; 

    char** teststrings; 

    teststrings = &test1; 
    *teststrings = test2; 

    cout << "The first string is: " 
     << teststrings 
     << " and your second string is: " 
     << *teststrings 
     << endl; 
} 
+1

मैं अपने कोड थोड़ा, reforma संपादित कर लिया है आउटपुट स्टेटमेंट को टिंग करना ताकि इसे स्क्रॉल किए बिना पढ़ा जा सके और शीर्ष पर कुछ आवश्यक लाइनें जोड़ सकें। –

+0

(http://stackoverflow.com/questions/9650058/deprecated-conversion-from-string-literal-to-char) –

उत्तर

39

सी ++ स्ट्रिंग शाब्दिक हैं स्थिरांकchar, आप कानूनी तौर पर उन्हें संशोधित नहीं कर सकते हैं जिसका मतलब है की सरणियों:

यहाँ मेरी कोड है।

आप सुरक्षित रूप से एक सूचक के लिए एक स्ट्रिंग शाब्दिक (जो एक अंतर्निहित सरणी-टू-सूचक रूपांतरण शामिल है) प्रदान करना चाहते हैं, तो आप न सिर्फ char* के रूप में, const char* के रूप में लक्ष्य सूचक की घोषणा करने की जरूरत है। (

#include <iostream> 
int main() { 
    char *ptr = "some literal"; // This is invalid 
    *ptr = 'S'; 
    std::cout << ptr << "\n"; 
} 

एक गैर const:

#include <iostream> 

using namespace std; 

struct WORDBLOCK 
{ 
    const char* string1; 
    const char* string2; 
}; 

void f3() 
{ 
    WORDBLOCK word; 

    word.string1 = "Test1"; 
    word.string2 = "Test2"; 

    const char *test1 = word.string1; 
    const char *test2 = word.string2; 

    const char** teststrings; 

    teststrings = &test1; 
    *teststrings = test2; 

    cout << "The first string is: " 
     << teststrings 
     << " and your second string is: " 
     << *teststrings 
     << endl; 
} 

पर विचार करता है, तो भाषा नहीं था इस प्रतिबंध को लागू क्या हो सकता है:

अपने कोड का एक संस्करण है कि चेतावनी के बिना संकलित है) char* आपको उस डेटा को संशोधित करने देता है जो सूचक इंगित करता है। यदि आप एक स्ट्रिंग शाब्दिक (स्ट्रिंग के पहले अक्षर में एक सूचक को पूरी तरह से परिवर्तित कर सकते हैं) को सादे char* पर असाइन कर सकते हैं, तो आप कंपाइलर से कोई चेतावनी के साथ स्ट्रिंग शाब्दिक को संशोधित करने के लिए उस पॉइंटर का उपयोग करने में सक्षम होंगे। अमान्य कोड से ऊपर, अगर यह काम किया,

Some literal 

प्रिंट होगा - और यह वास्तव में कुछ सिस्टम पर ऐसा हो सकता है। हालांकि, मेरे सिस्टम पर, यह सेगमेंटेशन गलती के साथ मर जाता है क्योंकि यह केवल पढ़ने योग्य स्मृति (भौतिक रोम नहीं, बल्कि स्मृति को ऑपरेटिंग सिस्टम द्वारा केवल पढ़ने के रूप में चिह्नित किया गया है) को लिखने का प्रयास करता है।

(एक तरफ: स्ट्रिंग शाब्दिक के लिए सी के नियमों सी ++ के नियमों से अलग हैं सी में एक स्ट्रिंग शाब्दिक char की एक सरणी है, नहींconst char की एक सरणी - लेकिन संशोधित करने के लिए यह व्यवहार अपरिभाषित है प्रयास करने से यह।। इसका मतलब है कि सी में आप कानूनी रूप से char *s = "hello"; s[0] = 'H'; लिख सकते हैं, और संकलक आवश्यक रूप से शिकायत नहीं करेगा - लेकिन जब आप इसे चलाते हैं तो प्रोग्राम सेगमेंटेशन गलती के साथ मरने की संभावना है। यह const से पहले सी कोड के साथ पिछड़े संगतता को बनाए रखने के लिए किया गया था। कीवर्ड पेश किया गया था। सी ++ शुरू से ही const थी, इसलिए इस विशेष समझौता आवश्यक नहीं था।)

+0

था [स्ट्रिंग 'चार \ *' के लिए शाब्दिक से पदावनत रूपांतरण] भविष्य की खोजों के लिए नकल के रूप में चिह्नित किया जा रहा अविश्वसनीय स्पष्ट, संसाधनपूर्ण, और प्रबुद्ध। आपकी मदद के लिए धन्यवाद, मैं अब इसे बेहतर समझता हूं! –

+0

स्पष्टीकरण बहुत अच्छा है लेकिन कोड अस्पष्ट और भ्रमित है - ऐसा लगता है कि आप "टेस्ट 1" और "टेस्ट 2" प्रिंट करने की उम्मीद कर रहे हैं, जबकि आप वास्तव में टेस्टस्ट्रिंग्स ('ऑफसेट 1' पर इंगित ऑफसेट) का मूल्य प्रिंट कर रहे हैं और स्ट्रिंग पॉइंट 'test1' (जो "test2" है, क्योंकि आपने टेस्टस्ट्रिंग के माध्यम से' test1' को संशोधित किया है) – neuviemeporte

+0

@neuviemeporte: (मुझे पता है कि मैं थोड़ा देर से उत्तर दे रहा हूं।) मैंने जो कुछ किया वह ओपी के कोड में आवश्यक 'कॉन्स' कीवर्ड जोड़ता था । मैंने कोई अन्य सुधार या सुधार करने की कोशिश नहीं की। –

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