2011-12-30 18 views
18

printf ve wprintf işlevlerini kodda birlikte kullanırken sorun yaşıyorum. Normal dize önce yazdırılırsa, wprintf çalışmaz. Önce wprintf kullanırsam printf çalışmıyor.printf ve wprintf, tek C kodunda

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

Çıkışlar:

No printing! 
ASCII 

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

çıkışlar:

Printing! 
Wide char 

gcc kullanıyorum (GCC) glibc 2.14 ile birlikte 4.6.1 20.110.819 ile 64bit Linux 3.0.

+0

Linux 3.0? Bu da ne? Hangi dağılımı? – bmargulies

+0

@bmargulies: Çekirdek sürümü. Dağıtım Archlinux. –

cevap

14

Bu beklenen bir durumdur; kodunuz tanımlanmamış davranışları çağırıyor. C standardı başına, her bir FILE akışı, onun üzerinde gerçekleştirilen ilk işlem tarafından belirlenen ve fwide işleviyle denetlenebilen bir "yönelim" ("bayt" veya "geniş") ile ilişkilidir. . tanımsız davranış akışı sonuçlarının yönlendirme ile oryantasyon çatışmalar

+0

davranışı tanımsız veya yönelim yazılacak verilerin uyumlu olmadığında ise basitçe hiçbir şey çıktısı mı? – alk

+0

Buna dayanarak: http://www.gnu.org/savannah-checkouts/gnu/libc/manual/html_node/Streams-and-I18N.html, davranış tanımsızdır. – DRH

+2

@alk Tanımlanamayan davranış, bu durumda nasıl davranması gerektiği konusunda bir beklenti olmadığı anlamına gelir. Bu nedenle, sessiz bir şekilde metni doğru yönlendirmeye veya çöp yazdırmaya dönüştürdüğünden hiçbir şey çıkarılamaz. –

2

R tamamlamak için .. 'kabul s cevap: bu iken

çok seyrek/wprintf daha net gösterecektir printf dönüş kodu kontrol yapılır bunlardan biri çalışmıyor (akımın geçerli yönüne göre geçersiz olan yazdırma işlevi için -1 döndürmelidir).

Maalesef standart kütüphane fonksiyonları hataları kontrol etmek için ortak bir model:

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

çok burada yardımcı olmayabilir: akışı çıkışı olmayan geniş karakterler olarak ayarlanmış ve wprintf çağrı ise, errno olmayabilir set ve çok bilgi vermez wprintf: Success alırsınız.

Gerçekten de bu, akışların karakter yönelimini bilmediğinizde, sorunu anlamak biraz zor.

+0

Dönüş değerinin kontrol edilmesi, tanımlanamayan bir davranışınız olduğunda tanımlanamayan bir hata olduğunda yardımcı olur. Yönlendirme yanlış olduğunda 'wprintf' başarısız olarak belirtilmemiş. Aksine, yönelim yanlış olduğunda ne yapar * hiç belirtilmemiş *. Tanımlanmamış olan budur. –