2011-12-30 13 views
18

Ho un problema quando si utilizzano le funzioni printf e wprintf insieme nel codice. Se la stringa normale viene stampata per prima, allora wprintf non funziona. Se prima utilizzo wprintf, allora printf non funziona.printf e wprintf in singolo codice C

#include <stdio.h> 
#include <wchar.h> 
#include <stdlib.h> 
#include <locale.h> 

int main() 
{ 
    setlocale(LC_ALL,""); 

    printf("No printing!\n"); 
    wprintf(L"Printing!\n"); 
    wprintf(L"Wide char\n"); 
    printf("ASCII\n"); 
    return 0; 
} 

Uscite:

No printing! 
ASCII 

Mentre

#include <stdio.h> 
#include <wchar.h> 
#include <stdlib.h> 
#include <locale.h> 

int main() 
{ 
    setlocale(LC_ALL,""); 

    wprintf(L"Printing!\n"); 
    printf("No printing!\n"); 
    wprintf(L"Wide char\n"); 
    printf("ASCII\n"); 
    return 0; 
} 

uscite:

Printing! 
Wide char 

sto usando gcc (GCC) 4.6.1 20110819 insieme con glibc 2.14 su 64bit Linux 3.0.

+0

Linux 3.0? Cos'è quello? Quale distribuzione? – bmargulies

+0

@bmargulies: versione del kernel. La distribuzione è Archlinux. –

risposta

14

Questo è normale; il tuo codice sta invocando un comportamento indefinito. Per lo standard C, a ciascun flusso FILE è associato un "orientamento" ("byte" o "ampio") impostato dalla prima operazione eseguita su di esso e che può essere ispezionato con la funzione fwide. la risposta di accettate conflitti di orientamento con l'orientamento dei risultati del flusso in un comportamento indefinito

+0

È un comportamento non definito o semplicemente non emette nulla se l'orientamento non corrisponde ai dati da scrivere? – alk

+0

Basato su questo: http://www.gnu.org/savannah-checkouts/gnu/libc/manual/html_node/Streams-and-I18N.html, il comportamento non è definito. – DRH

+2

@alk Un comportamento indefinito significa che non ci sono aspettative su come dovrebbe comportarsi in questa circostanza. Pertanto, l'output di nulla è accettabile, così come la conversione silenziosa del testo all'orientamento corretto o alla stampa dei rifiuti. –

2

per completare R .. ':.

Mentre questo è molto raramente fatto, controllando il codice di ritorno di printf/wprintf sarebbe più indicare chiaramente che uno di essi non funziona (dovrebbe restituire -1 per la funzione di stampa che non è valida in base all'orientamento corrente del flusso)

Purtroppo, un modello comune per il controllo di errori di funzioni della libreria standard:

if (wprintf(...) == -1) { perror("wprintf"); ... } 

non può aiutare molto qui: se il flusso è impostato su caratteri non-larghi in uscita, e si chiama wprintf, errno potrebbero non essere impostato e riceverai wprintf: Success, che non fornisce molte informazioni.

Quindi, in effetti, questo è un problema piuttosto difficile da capire quando non si conosce l'orientamento dei caratteri degli stream.

+0

Il controllo del valore di ritorno aiuta quando si ha un errore da segnalare, non quando si ha un comportamento indefinito. 'wprintf' non è specificato per fallire quando l'orientamento è sbagliato. Piuttosto, ciò che fa quando l'orientamento è sbagliato è * non specificato affatto *. Questo è ciò che significa indefinito. –