Çok baytlı dönüşüm
- C kursu
- İleri seviye
- Ders 64/83
- 5 dk
Çok baytlı ve geniş karakter dönüşümünü öğrenirsin.
mbstowcs ve wcstombs
mbstowcs çok baytlı bir dizeyi geniş karakter dizisine çevirir; wcstombs tersini yapar. İkisi de <stdlib.h> başlığındadır.
mbstowcs(NULL, s, 0) yalnızca sonuçtaki geniş karakter sayısını sayar; bellek ayırmaz. mbstowcs(wbuf, s, n) ise wbuf'a yazar. ASCII dize için bayt sayısı ve geniş karakter sayısı aynıdır: "Merhaba" için her ikisi 7. Dönüşümden önce setlocale(LC_ALL, "") veya "C" çağrılmalı; yoksa davranış tanımsızdır.
ASCII dönüşümü
ASCII dize "Merhaba" için strlen 7, mbstowcs(NULL, s, 0) de 7 döner. Karakter başına tek bayt tek geniş karakter eşler.
Eğer dize "çağ" olsaydı strlen 5 (iki harf ikişer bayt), mbstowcs 3 dönerdi. Bu derste ASCII üzerinden gidiyoruz; çıktı deterministik olsun diye setlocale(LC_ALL, "C") ile başlıyoruz. Dönüşüm sonrası wprintf yerine printf ile sayıları basıyoruz.
Uygulama Bayt ve geniş karakter sayısı
Önce setlocale(LC_ALL, "C"); çağır. const char *s = "Merhaba"; tanımla. size_t mb = strlen(s); ve size_t wcs = mbstowcs(NULL, s, 0); hesapla. printf("mb: %zu\n", mb); ve printf("wcs: %zu\n", wcs); yazdır.
Başlangıç kodu
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
// Yereli 'C' olarak kur
// "Merhaba" için strlen ve mbstowcs sayılarını yazdır
int main(void) {
return 0;
}Örnek çözüm
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
int main(void) {
setlocale(LC_ALL, "C");
const char *s = "Merhaba";
size_t mb = strlen(s);
size_t wcs = mbstowcs(NULL, s, 0);
printf("mb: %zu\n", mb);
printf("wcs: %zu\n", wcs);
return 0;
}Beklenen çıktı
mb: 7 wcs: 7
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 mbstowcs(NULL, s, 0) ne yapar?
- Hata verir
- Bellek ayırır
- Dizeyi kopyalar
- Geniş karakter sayar Doğru cevap
Açıklama: Üçüncü parametre 0 ise yalnızca sayar.
2 Dönüşüm işlevlerini eşle
| Kavram | Anlamı |
|---|---|
mbstowcs |
Çok baytlı→geniş |
wcstombs |
Geniş→çok baytlı |
setlocale |
Yerel kurar |
strlen |
Bayt sayar |
3 mbstowcs çağrısı
size_t n = mbstowcs(NULL, s, ____);
size_t n = mbstowcs(NULL, s, 0);
Açıklama: Üçüncü parametre 0 sayma kipidir.