In un senso che system
è una parte della libreria C standard, la funzione stessa è completamente sicura. Il problema si trova nella parte di comando della chiamata, ad esempio "clear"
nell'esempio. Questo è fortemente dipendente dal sistema, rendendo il tuo programma non portatile.
Una soluzione comune a questo problema è fornire i comandi separatamente dal programma (ad esempio in un file) o definirli in una parte del codice che compila in modo condizionale. La prima soluzione è leggermente più flessibile, ma la seconda soluzione è più semplice da implementare.
Come potrei implementare una soluzione che avrebbe eseguito system("clear")
per Linux Terminal e system("cls")
per il Terminal di Windows?
L'approccio con la compilazione condizionale apparirebbe come segue: in primo luogo, ha messo queste definizioni nel programma
#ifdef WIN_TERMINAL
#define CLEAR_COMMAND "cls"
#endif
#ifdef UNIX_TERMINAL
#define CLEAR_COMMAND "clear"
#endif
Ora usare questo comando nel codice:
system(CLEAR_COMMAND);
Quando si compila il UNIX, passare -D UNIX_TERMINAL
durante la compilazione del programma. Questo di solito va nel tuo Makefile
. Su Windows, passare /D WIN_TERMINAL
al compilatore. Questo di solito va nella lista flag del preprocessore del tuo progetto Visual Studio.
Posso suggerire un'alternativa compatibile multipiattaforma: non cancellare lo schermo :) In alternativa è possibile scrivere 100 righe vuote per ottenere uno schermo vuoto, ma il testo si troverà invece nella parte inferiore della console. –
@ssg: Mentre scrivo questo, ho una finestra di terminale alta 105 righe. (È in esecuzione 'tcvt' in una finestra di xterm a schermo intero). Se vuoi cancellare lo schermo, cancella semplicemente lo schermo, anche se non esiste un modo * portatile * per farlo. Oppure, come suggerisci, considera di non cancellare lo schermo ed eventualmente di cancellare le informazioni dell'utente. –
@KeithThompson Supponevo che la "about page" fosse alta almeno la metà dello schermo, indirizzando la maggior parte delle configurazioni a termine, ma hai ragione. –