La sequenza \n
in una stringa o carattere letterale in C/C++ è un singolo byte con il valore numerico 10 (su un sistema ASCII). Quando si stampa su un terminale (prova putchar(10)
!) Imposta semplicemente la posizione di uscita per il carattere successivo sul terminale all'inizio della riga successiva (su * nix; su MacOS, penso, è necessario un ulteriore \r
o 13 per ritorno a capo per avere la posizione di uscita all'inizio della riga).
Analogamente, uno \t
è la notazione per un singolo byte con il valore 9, che fa sì che la maggior parte dei terminali faccia avanzare il cursore alla posizione successiva del tabulatore.
Quello che serve è inserire un singolo byte di questi valori nella riga di comando. Come ciò può essere fatto dipende dalla tua shell; in bash puoi impedire alla shell di interpretare caratteri speciali premendo Ctrl-V in anticipo. Questo produce, ad es. una scheda, visualizzata mostrando uno spazio vuoto (invece di fare in modo che la shell mostri possibili continuazioni di stringa o qualsiasi altra cosa faccia in bash). le stringhe di bash in virgolette singole o doppie possono includere nuove righe senza ulteriori sforzi: è sufficiente premere Invio.
Ecco un esempio di esecuzione in un terminale cygwin con bash. Ho premuto i tasti indicati nelle posizioni indicate; Ho finito il comando come al solito con [ritorno] dopo la citazione singola di chiusura sulla seconda riga.
pressed Ctrl-v,[TAB] here | pressed [return] there
v v
$ ./printf-arg.exe ' %s
> '
hello,world
Il >
nella seconda linea era uscita dalla shell dopo aver premuto inserite all'interno della stringa delimitata da apici. (Che inserisce una nuova riga nella stringa). È un'indicazione che la stringa che si sta modificando viene proseguita su quella linea.
Per inciso, probabilmente non è sicuro utilizzare gli argomenti della riga di comando in questo modo in ambienti potenzialmente ostili. Stringhe attentamente elaborate potrebbero accedere alla memoria a cui non si intende accedere e ad es. reindirizzare gli indirizzi di ritorno, corrompendo il programma.
fonte
2015-05-20 07:30:27
Beh chiaramente possibile impostare il formato di printf con quello arg, avete ancora il vostro \ t \ n. Il problema è che questi personaggi non sembrano essere letti come tabulazione e avanzamento di riga. Inoltre, ** non chiamare la stampa con un primo arg da input dell'utente è un difetto di sicurezza huuuuuge !!! ** – Eregrith
vedi [format string vulnerability] (http://www.cis.syr.edu/~wedu/Teaching/ cis643/LectureNotes_New/Format_String.pdf) ad esempio :) – Eregrith
Questa domanda (o la sua risposta) in realtà non riguarda C o 'printf', ma sul perché la shell non interpreta' \ t' e '\ n' all'interno di stringhe in allo stesso modo del compilatore C. –