2009-03-14 21 views
9
#include<iostream.h> 
void main() 
{ 
    cout<<"Love"; 
} 

सवाल बदले बिना सी ++ उत्पादन बदलने कैसे हम में इस कार्यक्रम का उत्पादन बदल सकते हैं main() में कोई बदलाव किए बिना "आई लव यू" है।मुख्य() फ़ंक्शन

+1

प्रश्न शीर्षक बदलें! –

+0

भले ही यह होमवर्क पर धोखा दे रहा है, यह वास्तव में एक प्रश्न है, आप कुछ सीख सकते हैं, जैसा कि litb के उत्तर द्वारा प्रदर्शित किया गया है। –

+3

@ हनो: एक महान जवाब जरूरी नहीं है कि एक महान सवाल है। –

उत्तर

-1

आपको किसी अन्य फ़ंक्शन को कॉल करके या टेक्स्ट को बदलकर मुख्य को बदलने की आवश्यकता है। चूंकि main() आपके प्रोग्राम का मुख्य आउटपुट

+0

-1 क्योंकि यह सच नहीं है। –

-1

क्या आप थोड़ा और सटीक हो सकते हैं?

क्या आप कोड के उस टुकड़े का उत्पादन "प्यार" के बजाय "मैं तुमसे प्यार करता हूं" होना चाहता हूं?

संपादित करें: मुझे नहीं लगता कि आप मुख्य() में कोड की कम से कम एक पंक्ति को बदलने के बिना नहीं कर सकते हैं। आप या तो < < < < "प्यार" से "प्यार" को बदल सकते हैं "मैं तुमसे प्यार करता हूं" या बस उस विशिष्ट पंक्ति को आउटपुट करने वाला एक फ़ंक्शन जोड़ें।

+0

हाँ..मुझे उस आउटपुट की आवश्यकता है जैसा आपने कहा था .. लेकिन एकमात्र शर्त यह है कि मुख्य() में भी एक लाइन कोड परिवर्तन नहीं होगा। – Binu

+0

एह, आप वैश्विक नामस्थान में अपना स्वयं का चर 'cout' परिभाषित कर सकते हैं, और इसे std :: cout पर "मैं तुमसे प्यार करता हूं" प्रिंट करता हूं।:) – jalf

0

क्या आपका मुख्य कार्य एक int वापस नहीं करना चाहिए? आपको या तो विधि को बदलने की आवश्यकता होगी, या एक और प्रोग्राम लिखना होगा जिसमें यह एक पाइप हो, लेकिन यह एक साधारण स्ट्रिंग को बदलने के तरीके के बारे में सबसे अधिक गोल है ...

+0

सी ++ मुख्य() में एक विशेष कार्य है, और मानक द्वारा केवल एक वापसी प्रकार घोषित करने की अनुमति है और वास्तव में कुछ भी वापस नहीं लौटाता है (इस मामले में मानक कहता है कि संकलक ऐसा करेगा जैसे 0 को वापस किया गया था उपयोगकर्ता) –

+0

@ डेविड रोडिगुएज़-ड्राईबीस: फिर भी, ** ** **की वापसी प्रकार 'int' है। –

2

उस कोड में std का उपयोग नहीं किया गया है लेकिन वैसे भी काउंटर के चारों ओर अपने स्वयं के रैपर को लिखने और उपयोग करने वाले std को हटाने की आवश्यकता होगी यदि रैपर परिभाषित किया गया है जहां mystd का उपयोग करने के साथ वहां था।

1

मुझे लगता है कि आप एक ऑपरेटर < < लिख सकते हैं जो वर्तमान आउटपुट के बाद "मैं" और "आप" जोड़ता है।

+0

# शामिल # शामिल # शामिल नामस्थान std का उपयोग कर; # परिभाषित cout printf ("मैं तुमसे प्यार करता हूँ"); ostringstream ओएस; ओएस /* न्यूलाइन */ int मुख्य() { \t cout << "प्यार"; } – rlbond

+0

@rlbond erm, यह बहुत दुर्घटनाग्रस्त नहीं होगा क्योंकि आप printf() कर रहे हैं; << "प्यार"; ? = डी –

91

ठीक है, अपने मुख्य कार्य और iostream.h फिक्सिंग ... इस तरह

#include <iostream> 

// to make sure std::cout is constructed when we use it 
// before main was called - thxx to @chappar 
std::ios_base::Init stream_initializer; 

struct caller { 
    caller() { std::cout << "I "; } 
    ~caller() { std::cout << " You"; } 
} c; 

// ohh well, for the br0ken main function 
using std::cout; 

int main() 
{ 
    cout<<"Love"; 
} 

मैं सोचा मैं क्यों कि काम करता है समझाने चाहिए। कोड एक संरचना को परिभाषित करता है जिसमें एक निर्माता और विनाशक होता है। जब आप संरचना का ऑब्जेक्ट बनाते हैं तो कन्स्ट्रक्टर चलाया जाता है और जब ऑब्जेक्ट नष्ट हो जाता है तो विनाशक चलाया जाता है। अब, एक संरचना परिभाषा के अंत में, आप घोषणाकर्ताओं को डाल सकते हैं जिनके प्रकार caller होगा।

तो, हमने ऊपर जो किया है वह c नामक ऑब्जेक्ट बना रहा है जिसे प्रोग्राम शुरू होने पर बनाया गया है (और कन्स्ट्रक्टर कहा जाता है) - मुख्य भाग से पहले भी। और जब कार्यक्रम समाप्त हो जाता है, वस्तु नष्ट हो जाती है और विनाशक चलाया जाता है। बीच में, main मुद्रित "प्यार"।

यह पैटर्न वास्तव में RAII शब्द से बहुत अच्छी तरह से जाना जाता है जो आम तौर पर निर्माता में कुछ संसाधन का दावा करता है और इसे विनाशक कॉल में फिर से जारी करता है।

+1

@ बिनू: लेकिन क्या आप * क्यों * यह काम करता है? यदि आप करते हैं, तो आपने सी ++ के बारे में कुछ महत्वपूर्ण सीखा है ... – dmckee

+0

असल में मैं समझ नहीं पा रहा हूं .. डीएमकी क्या आप अधिक विशिष्ट हो सकते हैं? – Binu

+0

@ बिनू: ठीक है, libt ने समझाया। यह लगभग * जब * रचनाकार और विनाशक दौड़ते हैं, और 'सी' का जीवनकाल क्या होता है। "सी;" को बदलने का प्रयास करें "सी, डी;" के साथ और देखें कि क्या होता है ... – dmckee

8

इस तरह:

#include <iostream> 
int main() { 
    std::cout << "I Love You" << std::endl; 
    return 0; 
} 

/* 
#include<iostream.h> 
void main() 
{ 
    cout<<"Love"; 
} 
*/ 

इस तरह, आप main में कुछ भी नहीं बदला है। :-p

+0

मेरा मतलब है # शामिल करें int मुख्य() { std :: cout << "प्यार"; वापसी 0; } अब .. मुख्य() में कोई परिवर्तन किए बिना आउटपुट में I Love को बदलें। – Binu

+3

खराब जवाब, बिल्कुल मजाकिया नहीं। अगर 2 या 3 अंकों की प्रतिष्ठा धारक इस जवाब को पोस्ट करता है तो उसे इसके लिए एक -10 मिल जाएगा। आपके लिए एसओ डबल मानक है! :-) –

+0

@RealRed .: \ [उद्धरण आवश्यक \] –

-2

ऐसा लगता है कि आप कह रहे हैं कि आप कोड परिवर्तन नहीं चाहते हैं, लेकिन आप अलग-अलग व्यवहार चाहते हैं।

  1. या तो दुरुपयोग पूर्व प्रोसेसर/संकलक, या कोड के रूप में litb के रचनात्मक समाधान में ऊपर देखा: चूंकि व्यवहार आप चाहते हैं जादू के द्वारा प्राप्त नहीं किया जा सकता कि आप दो वास्तविक समाधान है।
  2. कोड को संकलित करें ताकि यह "प्यार" प्रिंट हो, लेकिन फिर उत्पन्न बाइनरी को संपादित करें।

मुझे? मैं कॉपी सुरक्षा तोड़ता था इसलिए मैं बाद का मार्ग जाऊंगा। आपके पास मौजूद स्रोत से प्रोग्राम बनाएं लेकिन फिर बाइनरी संपादित करें ताकि यह व्यवहार करे कि आप कैसे पसंद करते हैं।

इस समाधान की चौराहे की प्रकृति को देखते हुए हालांकि मैं दृढ़ता से आपकी प्रेरणा पर आश्चर्यचकित हूं। यह इस तरह के एक व्यर्थ सवाल पूछने के लिए जब तक आप compilers समझ में नहीं आता, या भयावह प्रेरणा है की तरह लगता है ...

39
#include <iostream> 
class tclass 
{ 
    public: 
    void operator <<(char *s) 
    { 
      std::cout<<"I"<<s<<"You"<<std::endl; 
    } 
}; 

tclass cout; 

int main() 
{ 
    cout<<"love"; 
} 
+0

यह भी बहुत चालाक है। –

+0

बहुत चालाक, असाधारण तरीके से करने की कोई ज़रूरत नहीं है, यह आसान तरीका है, जो आपने किया है। यह ठंडा नहीं होने पर litb के जवाब के रूप में अच्छा है। वास्तव में बहुत अच्छा किया! –

+0

असल में, यह गलत आउटपुट उत्पन्न करता है। –

9

के रूप में सुंदर नहीं litb के रूप में, लेकिन एक विकल्प:

#include <iostream> 
using namespace std; 

int foo() 
{ 
    cout << "I Love You" << endl; 
    return cout.rdbuf(0); 
} 
int i = foo(); 

int main() 
{ 
    cout << "Love" << endl; 
} 
+0

rdbuf (0) क्या करता है? क्या आपका प्रोग्राम "आई लव यू" प्रिंट करने के बाद "लव" प्रिंट करता है? यदि ऐसा होता है, तो क्या हम संभवतः मुख्य() को निष्पादित किए बिना foo() के अंदर प्रोग्राम को समाप्त कर सकते हैं? – chappar

+1

यह कुछ भी करने के लिए कोउट को पुनर्निर्देशित करके "प्यार" के आउटपुट को छुपाता है। यह केवल "आई लव यू" प्रिंट करता है। – CTT

0

सबक यह है कि सी ++ स्थिर कन्स्ट्रक्टर/विनाशकों के माध्यम से मुख्य() के पहले और बाद में कोड निष्पादित कर सकता है, उदाहरण के लिए। कोड litb द्वारा पोस्ट किया गया।

+0

तो आपका जवाब "उस पर दूसरे जवाब को देखें"? –

13
litb के रूप में नहीं

के रूप में सुंदर है, लेकिन यह

#include <iostream> 
#include <cstdio> 
#include <sstream> 

#define cout  printf("I love you\n"); std::ostringstream os; os 

int main() 
{ 
    cout << "love"; 
} 
बेशक

काम करता है, तो आप एक stringstream उपयोग करने की आवश्यकता नहीं है, आप operator<< के साथ किसी भी वर्ग इस्तेमाल कर सकते हैं।

+0

सस्ता लेकिन प्रभावी। –

+1

हैकिश :) अभी भी अच्छा है। –

0

मान लीजिए कि यह एक कक्षा असाइनमेंट था, मुझे लगता है कि यह विचार था कि आप iostream.h को फिर से लिख सकते हैं, क्योंकि सी ++ इसे विशेष रूप से (विशेष "की कुछ परिभाषाओं के लिए) नहीं मानता है।

+0

यदि तथ्य मानक मानक Iostream (और अन्य सभी मानक शीर्षकों) का इलाज अलग-अलग करता है।कंपाइलर को वास्तव में हेडर फ़ाइल सहित कोड में परिभाषाओं को इंजेक्ट करने की अनुमति है। फिर फिर भी, अगर कंपेलरों को ऐसा करने की अनुमति है, तो भी अधिकांश वर्तमान कार्यान्वयन नहीं करते हैं। वैसे भी, कोण ब्रैकेट के उपयोग में ठोस प्रभाव होते हैं (कुछ कंपाइलर्स के साथ यह पहले संकलक और सिस्टम विस्तृत निर्देशिकाओं में स्थानीय रूप से फ़ाइलों की खोज करेगा), फिर फिर से (फिर से) अन्य कंपाइलर्स केवल कोण ब्रैकेट और डबल कोट्स का समान रूप से इलाज करते हैं। –

+0

दूसरे शब्दों में "विशेष 'की कुछ परिभाषाओं के लिए।" –

+0

@ डेविडरोड्रिगुएज़-ड्राईबीस: लेकिन 'iostream.h' नहीं, जो लाइब्रेरी का हिस्सा नहीं है। –

5

हम यह भी है कि यह कर सकते हैं:

#include <iostream> 
#include <cstdlib> 
using namespace std; 

int fnfoo(int inum){ 
    cout << "I Love You" << endl; 
    return (exit(0),inum); 
} 

int dummy = fnfoo(5); 

int main() 
{ 
    cout << "Love" << endl; 
} 

सरल और पूरी तरह से काम करता है;)

-1

मैं वाकई हैरान कि कोई #define सुझाव दिया "प्यार" "मैं तुमसे प्यार करता हूँ" हूँ ... :)

+3

शायद क्योंकि आप नहीं कर सकते हैं। – GManNickG

+0

यह काम नहीं करेगा क्योंकि "लव" एक स्ट्रिंग है और पहचानकर्ता या प्रतीकात्मक नाम नहीं है। – naivnomore

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