LINUX.ORG.RU

Пусть дан код:

#include <stdio.h>

int main() {
   printf("|%10.10s|\n", "hello");
   printf("|%10.10s|\n", "даров");
   return 0;
}
Вывод будет следующий:
|     hello|
|даров|
Т.е игнарируются префикс перед спецификатором. Как решить данную проблему?

sol_linux ★★
() автор топика
Ответ на: комментарий от sol_linux
gcc 1.c 
14:44 /tmp
./a.out 
|     hello|
|     даров|

?

Полностью скопировал ваше:

cat 1.c 
#include <stdio.h> 
 
int main() { 
   printf("|%10.10s|\n", "hello"); 
   printf("|%10.10s|\n", "даров"); 
   return 0; 
} 

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Думаю, проблема в вашем случае в том, что у вас локаль двухбайтная.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от sol_linux

Он не игнорируется, просто работает с однобайтовым ASCII в котором ваше 'даров' занимает 10 символов. Нужно смотреть в сторну wprintf()

mikki
()
Ответ на: комментарий от sol_linux

Хорошим тоном является использование только латиницы в выводе. Вся локализация делается через gettext или что-нибудь подобное.

GArik ★★★
()
Ответ на: комментарий от sol_linux
locale
LANG=ru_RU.KOI8-R
LC_CTYPE="ru_RU.koi8-r"
LC_NUMERIC="ru_RU.koi8-r"
LC_TIME="ru_RU.koi8-r"
LC_COLLATE="ru_RU.koi8-r"
LC_MONETARY="ru_RU.koi8-r"
LC_MESSAGES="ru_RU.koi8-r"
LC_PAPER="ru_RU.koi8-r"
LC_NAME="ru_RU.koi8-r"
LC_ADDRESS="ru_RU.koi8-r"
LC_TELEPHONE="ru_RU.koi8-r"
LC_MEASUREMENT="ru_RU.koi8-r"
LC_IDENTIFICATION="ru_RU.koi8-r"
LC_ALL=ru_RU.koi8-r
Eddy_Em ☆☆☆☆☆
()

Пример с wide char:

#define _ISOC99_SOURCE

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

int main(void) {
	if(setlocale(LC_ALL,"") == NULL) {
		return 1;
	}
	wprintf(L"|%10.10s|\n","hello");
	wprintf(L"|%10.10s|\n","даров");
	return 0;
}
$ ./test
|     hello|
|     даров|

edigaryev ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.