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

è come possiamo cambiare l'output di questo programma nella "Ti amo" senza fare alcun cambiamento nella main().Modifica uscita C++ senza cambiare la questione della funzione main()

+1

Cambia il titolo della domanda! –

+0

Anche se questo è un lavoro da barare, in realtà è una domanda da cui puoi imparare qualcosa, come dimostrato dalla risposta di litb. –

+3

@Hanno: Una buona risposta non implica necessariamente una grande domanda. –

risposta

-1

È necessario modificare il principale, chiamando un'altra funzione o modificando il testo. Dal main() è l'uscita principale del tuo programma

+0

-1 perché non è vero. –

-1

Puoi essere un po 'più preciso?

Vuoi che l'output di quel pezzo di codice sia "Ti amo" anziché "Amore"?

Modifica: Non penso che non sia possibile senza modificare almeno una riga di codice in main(). È possibile modificare da cout < < "Love" a cout < < "I love you" o semplicemente aggiungere una funzione che emette quella riga specifica.

+0

sì..ho bisogno di quell'uscita come hai detto..Ma l'unica condizione è che non ci sarà nemmeno una modifica di un singolo codice di linea in main(). – Binu

+0

Eh, potresti definire la tua variabile 'cout' nello spazio dei nomi globale e far stampare "I love you" a std :: cout.:) – jalf

0

Non dovrebbe la funzione principale restituire un int? Avrete bisogno di cambiare il metodo, o scrivere un altro programma in cui questo si inserisce, ma questo è il modo più rotondo per cambiare una semplice stringa ...

+0

In C++ main() è una funzione speciale, e l'unica consentita dallo standard di dichiarare un tipo di ritorno e non restituire effettivamente nulla (nel qual caso lo standard dice che il compilatore funzionerà come se uno 0 fosse stato restituito da l'utente) –

+0

@ DavidRodríguez-dribeas: È, tuttavia, ** obbligatorio ** avere un tipo di ritorno di 'int'. –

2

Quel codice non ha utilizzato std ma in ogni caso richiederebbe di scrivere il proprio wrapper attorno a cout e rimuovere l'utilizzo di std se c'era e sostituire con mystd dove è definito il wrapper.

1

Immagino che potresti scrivere un operatore < < che ha aggiunto "I" prima e "Tu" dopo l'output corrente.

+0

#include #include #include utilizzando namespace std; #define cout printf ("Ti amo"); ostringstream os; os /* newline */ int main() { \t cout << "amore"; } – rlbond

+0

@rlbond erm, non si schianterebbe in modo orribile perché stai facendo printf(); << "amore"; ? = D –

91

Ok, fissando la funzione principale e iostream.h ... Questo è il modo

#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"; 
} 

ho pensato che avrei dovuto spiegare perché che funziona. Il codice definisce una struttura che ha un costruttore e un distruttore. Il costruttore viene eseguito quando si crea un oggetto della struct e il distruttore viene eseguito quando quell'oggetto viene distrutto. Ora, alla fine di una definizione di struct, puoi mettere i dichiaratori che avranno il tipo caller.

Quindi, quello che abbiamo fatto sopra è la creazione di un oggetto chiamato c che viene costruito (e chiamato il costruttore) all'avvio del programma - anche prima che venga eseguito main. E quando il programma termina, l'oggetto viene distrutto e viene eseguito il distruttore. Nel mezzo, main stampato "Amore".

Questo modello è in realtà molto noto con il termine RAII che di solito rivendica alcune risorse nel costruttore e lo rilascia nuovamente nella chiamata del distruttore.

+1

@Binu: Ma tu * perché * funziona? Se lo fai, hai imparato qualcosa di significativo su C++ ... – dmckee

+0

effettivamente non capisco..dmckee puoi essere più specifico? – Binu

+0

@Binu: Beh, l'ho spiegato libt. Riguarda * quando vengono eseguiti i costruttori ei distruttori, e qual è la durata di 'c'. Prova a sostituire "c;" con "c, d;" e vedi cosa succede ... – dmckee

8

Ti piace questa:

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

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

questo modo, non hanno cambiato nulla nel ilmain. :-p

+0

Quello che intendevo è #include int main() { std :: cout << "Love"; return 0; } ora .. cambia l'output in I Love You senza apportare modifiche a main(). – Binu

+3

cattiva risposta, non è affatto divertente. se un proprietario di reputazione di 2 o 3 cifre pubblica questa risposta otterrà un -10 per questo. questo è il doppio standard per te! :-) –

+0

@RealRed .: \ [citazione necessaria \] –

-2

Sembra che tu stia dicendo che non vuoi cambiare il codice, ma vuoi un comportamento diverso. Dal momento che il comportamento desiderato non può essere raggiunto con la magia si hanno due soluzioni reali:

  1. O abusare del pre-processore/compilatore, oppure il codice come visto sopra nella soluzione creativa litb.
  2. Compilare il codice così com'è per stampare "Amore", ma modificare il file binario generato.

Me? Ero abituato a rompere la protezione contro la copia così mi piacerebbe percorrere la seconda strada. Costruisci il programma dalla sorgente che hai ma poi modifica il file binario in modo che si comporti come preferisci.

Data la natura rotondeggiante di questa soluzione, tuttavia, mi chiedo fortemente delle vostre motivazioni. Sembra una domanda così inutile chiedere a meno che non si capisce compilatori, o hanno la motivazione di sinistro ...

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

tclass cout; 

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

Anche questo è abbastanza intelligente. –

+0

molto intelligente, non c'è bisogno di farlo in modo straordinario, fallo nel modo più semplice, questo è quello che hai fatto. questo è buono come risposta di litb se non così fresco. davvero ben fatto! –

+0

In realtà, produce risultati errati. –

9

Non elegante come litb di, ma un'alternativa:

#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

cosa fa rdbuf (0)? il tuo programma stampa "Amore" dopo aver stampato "Ti amo"? Se lo fa allora, potremmo forse terminare il programma dentro foo() senza mai dover eseguire main()? – chappar

+1

Nasconde l'output di "Love" reindirizzando cout a nulla. Stampa solo "Ti amo". – CTT

0

La lezione è che C++ può eseguire il codice prima e dopo main() tramite costruttori/distruttori statici, ad es. il codice pubblicato da litb.

+0

Quindi la tua risposta è "guarda quell'altra risposta laggiù"? –

13
Non

elegante come litb di, ma funziona

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

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

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

Naturalmente, non è necessario utilizzare un stringstream, è possibile utilizzare qualsiasi classe con operator<<.

+0

Economico ma efficace. –

+1

Hackish :) Ancora bello. –

0

Supponendo che questo fosse un compito di classe, scommetto che l'idea era di poter riscrivere iostream.h, poiché il C++ non lo tratta come speciale (per alcune definizioni di "speciale").

+0

Se è vero che lo standard tratta il trattamento iostream (e tutti gli altri header standard) in modo diverso.Il compilatore è autorizzato a inserire le definizioni nel codice senza includere effettivamente il file di intestazione. Poi di nuovo, anche se i compilatori sono autorizzati a farlo, la maggior parte delle implementazioni attuali no. Ad ogni modo, l'uso di parentesi angolari ha implicazioni concrete (con alcuni compilatori cercherà prima i file nelle directory del compilatore e del sistema, poi localmente), quindi ancora (ancora) altri compilatori trattano equamente le parentesi angolari e le doppie virgolette. –

+0

In altre parole "per alcune definizioni di" speciale "." –

+0

@ DavidRodríguez-dribeas: Ma non 'iostream.h', che non fa parte della libreria. –

5

possiamo farlo in questo modo troppo:

#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; 
} 

semplice e funziona perfettamente;)

-1

Sono davvero sorpreso che nessuno ha suggerito #define "Love" "Ti amo" ... :)

+3

Probabilmente perché non puoi. – GManNickG

+0

Questo non funzionerà poiché "Amore" è una stringa e non un identificatore o un nome simbolico. – naivnomore