2016-07-02 5 views
1

Рассмотрим следующий код:Почему mblen() всегда возвращает 1?

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

#define MAX 64 

void main(void) 
{ 
    char napis[] = "coś żółtego"; 
    int i; 
    wchar_t bufor[MAX]; 
    int ret; 

    setlocale(LC_CTYPE, ""); 

    printf("zwykły string [%s] długość %d\n", napis, mblen(napis, MAX)); // <--- 

    ret = mbstowcs(bufor, napis, sizeof bufor); 
    if (ret == MAX) 
     bufor[MAX-1] = '\0'; 
    if (ret > 0) 
    { 
     printf("16 bitowy string: [%ls] długość napisu %d długość %d\n", bufor, mblen(napis, MAX), ret); 
     for(i = 0; i < ret; i++) 
      printf("%lc|", bufor[i]); 
     printf("\n"); 
    } 
} 

Когда код с gcc -o file file.c и запустить его, я всегда получаю 1 из mblen(). Почему это происходит?

Все остальное отлично работает, но mblen() нет.

Я пытался использовать LC_ALL, но ничего не изменилось.

ответ

2

Потому что в "coś żółtego" первого "c" является только 1 байты

в mblen() функция осматриваемый не более п байт многобайтных строк начиная с и извлекает следующих полных многобайтовый символ.

Изменить на "żoś żółtego" и посмотреть, что произойдет.

+0

i get mblen() = 2 ;-) –

+0

Да, вы получаете 2, другими словами: 'mblen' не возвращает длину строки, а длину первого многобайтового символа. –