Tuesday 15 August 2017

C Printf Char Binario Options


Stampa dati formattati sullo standard output scrive la stringa C puntato dal formato sullo standard output (stdout). Se il formato include identificatori di formato (sottosuccessioni cominciare), gli argomenti aggiuntivi seguenti formati sono formattati e inseriti nella stringa risultante sostituendo i rispettivi committenti. Parametri string formato C che contiene il testo da scrivere su stdout. Si può opzionalmente contenere identificatori di formato incorporati che vengono sostituiti dai valori indicati nei successivi argomenti aggiuntivi e formattati come richiesto. Dove il carattere identificatore alla fine è la componente più significativa, dal momento che definisce il tipo e l'interpretazione del suo argomento corrispondente: Firmato punto intero decimale senza segno intero decimale senza segno esadecimale intero senza segno esadecimale intero (maiuscolo) decimale in virgola mobile, decimale minuscolo galleggiante, maiuscolo notazione scientifica (mantissaexponent), minuscole notazione scientifica (mantissaexponent), maiuscoli useranno la rappresentazione più breve: e o F Utilizzare la rappresentazione più breve: e o F esadecimale in virgola mobile, minuscole esadecimale in virgola mobile, stringa di caratteri maiuscoli Niente stampata. L'argomento corrispondente deve essere un puntatore ad un int firmato. Il numero di caratteri scritti finora è memorizzata nella posizione indicata. Un seguito da un altro personaggio scriverà un singolo al flusso. L'identificatore di formato può contenere anche sub-committenti: flags. larghezza ..precision e modificatori (in questo ordine), che sono facoltativi e seguono queste specifiche: sinistro giustifica all'interno del campo di ampiezza data la giustificazione destra è il valore di default (vedi larghezza sub-specifier). Forze per precedono il risultato con un segno più o meno (o -), anche per i numeri positivi. Per impostazione predefinita, solo i numeri negativi sono preceduti da un segno -. Se nessun segno sta per essere scritta, uno spazio vuoto viene inserito prima del valore. Utilizzato con o. x o X specifiche dell'avvio il valore è preceduto con 0. rispettivamente per diversi valori di zero 0x o 0X. Utilizzato con un. A. e. E. f. F. g o G esso forza l'uscita scritta per contenere un punto decimale anche se non più cifre seguono. Per impostazione predefinita, se non le cifre seguono, nessun punto decimale è scritto. Sinistra-pad il numero di zeri (0) al posto degli spazi quando viene specificato imbottitura (vedi larghezza sub-specifier). Per specificatori interi (d i o u x X.....): La precisione specifica il numero minimo di cifre da scrivere. Se il valore da scrivere è inferiore a questo numero, il risultato viene riempito con zeri. Il valore non viene troncato anche se il risultato è più lungo. Una precisione di 0 significa che nessun personaggio è stato scritto per il valore 0. Per un . A. e. E. F e F specificatori: questo è il numero di cifre da stampare dopo il punto decimale (per impostazione predefinita, questo è 6). Per g e specificatori G: Questo è il numero massimo di cifre significative da stampare. Per s. questo è il numero massimo di caratteri da stampare. Per impostazione predefinita, tutti i caratteri sono stampati fino a quando si incontra il carattere null finale. Se il periodo è specificato, senza un valore esplicito per la precisione. 0 viene assunto. La precisione non è specificato nella stringa di formato, ma come un ulteriore argomento valore intero che precede l'argomento che deve essere formattato. Il sub-identificatore di lunghezza modifica la lunghezza del tipo di dati. Questo è un grafico che mostra i tipi utilizzati per interpretare la relativa argomentazione con e senza specificatore di lunghezza (se viene utilizzato un tipo diverso, del tipo adatto promozione o conversione viene eseguita, se consentito): Nota relativa al c specificatore: prende un int ( o wintt) come argomento, ma esegue la corretta conversione di un valore char (o un wchart) prima di formattazione per l'uscita. Nota: Yellow righe indicano committenti e sub-committenti introdotte dal C99. Vedere ltcinttypesgt per i committenti per i tipi estesi. . (Argomenti accessorie) A seconda della stringa di formato, la funzione può aspettarsi una sequenza di argomenti aggiuntivi, ognuno contenente un valore da utilizzare per sostituire un identificatore di formato nella stringa di formato (o un puntatore a una posizione di memorizzazione, per n). Ci dovrebbe essere almeno come molti di questi argomenti il ​​numero di valori specificati nelle identificatori di formato. Ulteriori argomenti vengono ignorati dalla funzione. VALORE RESTITUITO In caso di successo, viene restituito il numero totale di caratteri scritti. Se si verifica un errore di scrittura, l'indicatore di errore (ferror) è impostato e un numero negativo viene restituito. Se un errore di codifica dei caratteri multibyte si verifica durante la scrittura di caratteri estesi, errno è impostato su EILSEQ e un numero negativo viene restituito. Compatibilità particolari implementazioni biblioteca possono supportare progettisti aggiuntivi e sub-committenti. Quelle elencate qui sono supportati dalle più recenti standard C e C (entrambi pubblicati nel 2011), ma quelli in giallo erano stati introdotti in C99 (richiesto solo per le implementazioni C rispetto C11), e potrebbero non essere supportate da librerie conformi agli standard più anziani. mette scrittura stringa sullo standard output (funzione) scanf Leggere i dati formattati da stdin (funzione) fprintf Write dati formattati per lo streaming (funzione) fwrite Write blocco di dati per lo streaming funzioni (funzione): costanti di macro: Ci non è un indicatore di conversione binaria in glibc normalmente . È possibile aggiungere tipi di conversione personalizzato alla famiglia printf () di funzioni in glibc. Vedere registerprintffunction per i dettagli. Si potrebbe aggiungere una conversione b personalizzato per uso personale, se si semplifica il codice dell'applicazione per averlo a disposizione. Ecco un esempio di come implementare un formato printf personalizzato in glibc. Inoltre, ciò che you39re parlando w. r.t. gestione dei risultati multiple in sequenza non è rientranza di per sé, ma piuttosto semplicemente la ricaduta di utilizzare ciò che equivale a un oggetto globale per memorizzare il risultato. Non è rientrato La funzione. In C il corretto, o almeno ampiamente utilizzato, linguaggio per gestire funzioni che memorizzano i loro risultati in un oggetto globale è copiare tali risultati immediatamente dopo il loro ottenimento. Questo ha il grande vantaggio che se solo risultato è richiesto per volta, senza dotazione supplementare è necessario. ndash Greg A. Woods 27 novembre 12 a 0:51 Qui we39re andando ad avere per non essere d'accordo. I can39t vedere come l'aggiunta di un simbolo di preprocessore discreto arriva ovunque vicino nocività di limitare i casi di utilizzo gravemente, rendendo l'interfaccia soggetto a errori, riservando memorizzazione permanente per la durata del programma per un valore temporaneo, e la generazione di codice che peggiorano maggior parte delle piattaforme moderni . ndash R .. 27 novembre 12 a 1:53 La famiglia printf () è solo in grado di stampare in base 8, 10, e 16 utilizzando direttamente i committenti standard. Suggerisci la creazione di una funzione che converte il numero in una stringa per i codici particolari esigenze. Tutte le altre risposte finora hanno almeno uno di questi limiti. Utilizzare memoria statica per il buffer di ritorno. Ciò limita il numero di volte che la funzione può essere utilizzata come argomento a printf (). Allocare la memoria che richiede il codice chiamante ai puntatori liberi. Richiedere il codice chiamante per fornire in modo esplicito un tampone adatto. Chiamare printf () direttamente. Questo obbliga una nuova funzione per di fprintf (). sprintf (). vsprintf (). ecc Utilizzare una gamma ridotta di numeri interi. Quanto segue non ha nulla della limitazione di cui sopra. Si richiede C99 o successiva e l'uso di s. Esso utilizza un letterale composto per fornire lo spazio di buffer. Non ha problemi con più chiamate in un printf ().Printf Stringhe di formato da Alex Allain Per impostazione predefinita, C fornisce una grande quantità di energia per la formattazione di uscita. La funzione di visualizzazione standard, printf, prende una stringa di formato che consente di specificare un sacco di informazioni su come un programma è formattato. Nota: se siete alla ricerca di informazioni sulla formattazione di output in C, dare un'occhiata a uscita formattazione C utilizzando iomanip. Vediamo l'anatomia di una stringa di formato seguito da alcuni programmi di esempio brevi per mostrare le diverse impostazioni in azione. I wont includere ogni singola opzione possibile - invece, il mio obiettivo è quello di rendere più agevole la comprensione delle mini-linguaggio che è possibile utilizzare per la creazione di stringhe di formato e ti insegnano come utilizzare la formattazione comune youre più probabilità di bisogno. Anatomia di una stringa di formato Quando si effettua una chiamata a printf, l'idea di base è che si sta per fornire una stringa di caratteri che ha alcuni caratteri letterali e alcuni elementi che devono essere sostituiti. Ad esempio, una stringa come: verrà stampato letteralmente come appare. Anche se a volte è sufficiente a dare letteralmente nel codice esattamente ciò che si desidera stampare, di solito si vuole fare qualcosa di più elaborato - sia l'introduzione di caratteri speciali utilizzando sequenze di escape o introducendo i valori delle variabili utilizzando identificatori di formato. Sequenze di escape Ci sono alcuni personaggi che non si può entrare direttamente in una stringa. Questi sono personaggi come un ritorno a capo, che deve essere rappresentato utilizzando una sintassi speciale. Questi sono chiamati sequenze di escape e simile a questa: Qui, Ive entrato nelle nuove righe tra ogni lettera, a, b e c. Ogni sequenza di escape inizia con una barra rovesciata (). Le principali sequenze di escape che il youll utilizzare sono: n, per mettere un ritorno a capo, e t, di mettere in una scheda. Dal momento che un backslash indica normalmente l'inizio di una sequenza di escape, se si vuole mettere in una sequenza di escape è necessario utilizzare per visualizzare una barra rovesciata: è come youd scrivere un percorso di Windows in C. C'è un altro trucco avanzata, che è che si può scrivere ltnumgt per visualizzare il carattere ASCII rappresentato dal valore di num. Questo è utile se si desidera visualizzare un personaggio che non puoi facilmente digita sulla tastiera, come ad esempio le lettere accentate. Ad esempio, 130 si stampare un carattere (in alcuni casi, a seconda di ciò che l'apparecchio è impostato fino a che fare con i caratteri ASCII estesi.) Identificatori di formato Se si vuole introdurre una certa varianza in uscita, lo fa indicando che esterni occorre dati: in questa stringa, la d indica che il valore da visualizzare in quel punto nella stringa deve essere presa da una variabile. Il segno indica che stiamo splicing alcuni dati nella stringa, e il carattere d indica che stiamo splicing in un numero decimale. La parte della stringa che inizia con si chiama di formato. Al fine di ottenere in realtà quel numero, abbiamo bisogno di stabilire che il valore a printf: che consente di visualizzare: la formattazione interessante che si può fare comporta la modifica dei valori si mette dopo il segno, che è il formato effettivo. Il formato per ciò che appare circa un segno è: La maggior parte di questi campi sono opzionali, tranne fornire un indicatore di conversione, che youve già visto (per esempio, usando d per stampare un numero decimale). La comprensione di questo formattazione è meglio farlo lavorando a ritroso, a partire dalla indicatore di conversione e di lavoro verso l'esterno. Così lascia iniziare a fine conversione Prescrizione L'indicatore di conversione è la parte di identificatore di formato che determina la formattazione di base del valore che deve essere stampato. indicatori di conversione per gli interi Se si desidera stampare un numero intero decimale in base 0, uso youd sia D o i. d o i. Se si desidera stampare un intero ottale o esadecimale youd uso o per ottale o x per esadecimale. Se si desidera lettere maiuscole (A, invece di una per la stampa fuori decimale 10) è possibile utilizzare X. indicatori di conversione per i numeri in virgola Visualizzazione numeri in virgola mobile ha una tonnellata di opzioni diverse galleggiante, meglio indicate in una tabella: Va bene, che era troppo male era però che la carta è un po 'complicato. La mia raccomandazione: basta usare g, e che di solito fare ciò che si vuole: Dove la notazione scientifica è più appropriato. Visualizzazione di un segno di percentuale Dal momento che il segno di percentuale viene utilizzato per definire identificatori di formato, ce n'è uno speciale identificatore di formato che significa stampa il simbolo di percentuale: per stampare semplicemente fuori un segno di percentuale. Ora, consente di camminare attraverso ciascuna delle diverse componenti di una di formato. Lunghezza Modificatore Il modificatore di lunghezza è forse stranamente-nome non modifica la lunghezza dell'uscita. Invece, la sua quello che si utilizza per specificare la lunghezza dell'input. Eh Diciamo che sono: Qui, d è l'ingresso a printf e quello che stai dicendo è che si desidera stampare d come un doppio, ma d non è un doppio, è un lungo doppio. Una lunga doppia è probabile che sia di 16 byte (rispetto a 8 per una doppia), quindi le materie differenza. Provare a eseguire quel piccolo frammento e youll scoprire che si ottiene in uscita immondizia che sembra qualcosa di simile: Ricordate, i byte che sono date a printf vengono trattati come una doppia - ma arent una doppia, theyre un lungo doppio. La lunghezza è sbagliato, ed i risultati sono brutti Il modificatore di lunghezza è tutto di aiutare accordo printf i casi in cui state usando insolitamente grandi (o insolitamente piccoli) variabili. Il modo migliore per pensare a modificatori di lunghezza è di dire: che tipo di variabile devo, e devo usare un modificatore di lunghezza per lo Heres una tabella che vi possono aiutare: long double d 3,1415,926535 millions printf (Lg, d) Id desidero fare menzione speciale per la gestione dei caratteri di larghezza. Se si scrive senza la l, il risultato sarà quello di stampare un singolo W per lo schermo. La ragione è che i caratteri di larghezza sono due byte, e per semplici caratteri ASCII come W, il secondo byte è 0. Pertanto, printf pensa che la stringa è fatto Devi dire printf per cercare caratteri multibyte aggiungendo l: LS. (Se vi capita di essere utilizzando wprintf, d'altra parte, si può semplicemente utilizzare s e sarà nativamente trattare tutte le stringhe stringhe di caratteri come larghezza.) Il modificatore precisione è scritto poi il numero, ed ha significati leggermente diversi per i diversi indicatori di conversione (come d o g). Per i numeri in virgola mobile (ad esempio f), che controlla il numero di cifre stampate dopo il punto decimale: Se il numero fornito ha più precisione rispetto è dato, si arrotondare. Ad esempio: visualizzerà come interessante notare che per g e G, controllerà il numero di cifre significative visualizzate. Questo avrà un impatto non solo il valore dopo il punto decimale, ma il numero intero. Per numeri interi, d'altra parte, la precisione controlla il numero minimo di cifre stampate: stamperà il numero 10 con tre cifre: Theres un caso speciale per interi - se si specifica .0, allora il numero zero avrà alcuna uscita : Infine, per archi, la precisione controlla la lunghezza massima della stringa visualizzata: Questa opzione è utile se è necessario fare in modo che l'output non va al di là di un numero fisso di caratteri. Il campo larghezza è quasi l'opposto del campo di precisione. Precisione controlla il numero massimo di caratteri da stampare, larghezza controlla il numero minimo, e ha lo stesso formato di precisione, tranne senza punto decimale: Gli spazi vuoti vanno all'inizio, per default. È possibile combinare la precisione e la larghezza, se vi piace: ltwidthgt. ltprecisiongt (. Si noti lo spazio iniziale) L'impostazione bandiera controlla i caratteri che vengono aggiunti a una stringa, ad esempio se si desidera aggiungere 0x ad un numero esadecimale, o se pad numeri con 0s. Le opzioni di bandiera specifici sono The Pound segno: Aggiunta di un causerà uno 0 da anteporre al un numero ottale (quando si utilizza la conversione identificatore o), o di un 0x per essere anteposto ad un numero esadecimale (quando si utilizza una conversione identificatore x). Per la maggior parte degli altri indicatori di conversione, l'aggiunta di una sarà semplicemente forzare l'inserimento di un punto decimale, anche se il numero non ha alcuna parte frazionaria. in fase di stampa. Considerando che i risultati a semplicemente la bandiera Zero: 0 0 Utilizzando costringerà il numero da imbottito con 0s. Ciò che conta veramente solo se si utilizza l'impostazione della larghezza di chiedere una larghezza minima per il vostro numero. Ad esempio, se si scrive: Il segno Flag: Il segno più includerà l'identificatore di segno per il numero: Il segno meno Bandiera: - Infine, il segno meno causerà l'uscita da allineato a sinistra. Questo è importante se si utilizza l'identificatore di larghezza e si desidera l'imbottitura di apparire alla fine della produzione anziché l'inizio: con l'imbottitura alla fine della produzione. La combinazione di tutti insieme per un dato di formato, è possibile fornire deve sempre fornire il segno di percentuale e l'identificatore di base. È quindi possibile includere qualsiasi, o tutte, delle bandiere, la larghezza e la precisione e la lunghezza desiderata. Si può anche includere più flag togeher. Ecco un esempio particolarmente complesso che dimostra più flag che sarebbe utile per la stampa indirizzi di memoria come valori esadecimali. Il modo più semplice per leggere questo è da notare prima il segno e poi leggere da destra a sinistra - la x indica che stiamo stampando un valore esadecimale 10 indica che vogliamo 10 caratteri larghezza totale della prossima 0 è un flag che indica che vogliamo al pad con 0s intead degli spazi, e, infine, il segno indica che vogliamo un prefisso 0x. Dal momento che si parte con 0x, questo significa anche avere 8 cifre - esattamente la giusta quantità per la stampa di un indirizzo di memoria a 32 bit. Il risultato finale è: Leggi articlesquot più simile ho bisogno di elaborare questo personaggio come un numero binario per stabilire se durante il processo di trasmissione dei dati ha corrupted. quot Im non sicuro di aver capito. Sembra che in questo caso non avete bisogno di visualizzare che UCHAR come binario o esadecimale, ma solo per fare un po 'di bit operazioni logiche e spostamenti su quel UCHAR. Qualcosa di simile a contare il numero di 1 bit da quello uchar ad esempio: unsigned char c 93 int bitcount 0 printf (quotbitcount: dnquot, bitcount) Sabato 9 Dicembre 2006 21:11 Questo è esattamente quello che stavo cercando (un riporto ). Ma con qualche aggiustamento al pezzo di codice che mi hai dato riesco a farlo unsigned char C 93 printf (ctxnn, c, c) se (c amp 128) DJ1 per (j0jlt8j) printf (d, Dj) Domenica, Dicembre 10, 2006 2:20 PM Tutte le risposte per il formato esadecimale printf ha il di formato x che fa questo. Per binario è possibile utilizzare itoa funzione: unsigned char ch 934 un valore unsigned char casuale per visualizzare tampone text16 char da usare con itoa printf (. Quotxnquot ch) esadecimale utilizzando il formato x identificatore itoa (ch, testo, 16) hex usando itoa con base 16 printf (quotsnquot. testo) itoa (ch, testo, 2) utilizzando itoa con base 2 printf (quotsnquot, testo) Sabato 9 dicembre 2006 19:49 Grazie per la risposta rapida Questo pezzo di codice funziona in circostanze normali ma nel mio caso particolare UCHAR è parte di un messaggio trasmesso da un UART, a cui un flusso di dati è collegato. Così, ho bisogno di elaborare questo personaggio come un numero binario per stabilire se durante il processo di trasmissione dei dati ha danneggiato. Sabato 9 dicembre, 2006 08:42 quot ho bisogno di elaborare questo personaggio come un numero binario per stabilire se durante il processo di trasmissione dei dati ha corrupted. quot Im non sicuro di aver capito. Sembra che in questo caso non avete bisogno di visualizzare che UCHAR come binario o esadecimale, ma solo per fare un po 'di bit operazioni logiche e spostamenti su quel UCHAR. Qualcosa di simile a contare il numero di 1 bit da quello uchar ad esempio: unsigned char c 93 int bitcount 0 printf (quotbitcount: dnquot, bitcount) Sabato 9 Dicembre 2006 21:11 Potrei recuperare a poco a poco spostando verso destra (gtgt) oa sinistra (LTLT) Ie CF 66-01.010.101 Dove l'ultimo bit è andato. Domenica 10 dicembre 2006 10:02 No, non puoi. È necessario testare di nuovo e così via la punta prima, spostamento, di prova. Nel linguaggio assembly la punta che esce di solito può essere trovato in qualcosa chiamato quotcarry flagquot e può essere testato lì, ma CC non ha una cosa del genere. Domenica 10 dicembre 2006 13:18 Questo è esattamente quello che cercavo (un riporto). Ma con qualche aggiustamento al pezzo di codice che mi hai dato riesco a farlo unsigned char C 93 printf (ctxnn, c, c) se (c amp 128) DJ1 per (j0jlt8j) printf (d, Dj) Domenica, Dicembre 10, 2006 14:20 Questo non ha un aspetto corretto per me. Mercoledì 7 Novembre 2007 17:25 Microsoft sta conducendo un sondaggio in linea per comprendere l'opinione del sito Web MSDN. Se si sceglie di partecipare, il sondaggio on-line sarà presentato a voi quando si lascia il sito Web MSDN. Ti piacerebbe partecipare

No comments:

Post a Comment