Функция C printf неправильно выравнивает строки для строк, содержащих турецкие символы - PullRequest
0 голосов
/ 01 марта 2019

У меня есть следующий код для печати некоторых строк на консоли в формате, выровненном по левому краю:

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

int main()
{
    printf("%s:\n", "Türkçe karakterler ile");
    printf("%-14s: \n", "Onaltılık");
    printf("%-14s: \n", "Onluk");
    printf("%-14s: \n", "İkilik");

    printf("\n%s:\n", "Türkçe karakterler olmadan");
    printf("%-14s: \n", "Onaltilik");
    printf("%-14s: \n", "Onluk");
    printf("%-14s: \n", "Ikilik");
}

Я скомпилировал этот код с gcc (7.3.0) и clang (6.0.0) насистема Ubuntu 18.04.

Вывод выглядит следующим образом:

Türkçe karakterler ile:
Onaltılık  : 
Onluk        : 
İkilik      : 

Türkçe karakterler olmadan:
Onaltilik     : 
Onluk         : 
Ikilik        :

Как видно из кода в первой группе строк, есть некоторые турецкие символы, такие как 'ı' и'Я'.Во второй группе строк нет турецких символов.

Вывод функции printf неправильно выровнен для строк, содержащих турецкие символы.Ожидаемый вывод:

Türkçe karakterler ile:
Onaltılık     : 
Onluk         : 
İkilik        : 

Türkçe karakterler olmadan:
Onaltilik     : 
Onluk         : 
Ikilik        :

Если я скомпилирую тот же код в системе Windows (Windows 7) с помощью gcc (MinGW v5.1.1 внутри CodeBlocks 17.2), вывод будет правильным, как показано ниже:

Türkçe karakterler ile:
Onaltılık     :
Onluk         :
İkilik        :

Türkçe karakterler olmadan:
Onaltilik     :
Onluk         :
Ikilik        :

Может кто-нибудь помочь мне разобраться в чем проблема?

1 Ответ

0 голосов
/ 01 марта 2019

Полагаю, это потому, что ваш редактор сохранил источник с использованием UTF-8, который является многобайтовой кодировкой.Семейство функций printf имеет дело только со строками byte .Это означает, что каждый не-ASCII символ будет считаться как несколько символов на printf.

Если это так, вы можете обойти проблему, напечатав строку, а затем добавив отступ вручную после использования *модификатор при печати пустой строки.Модификатор * позволяет передавать ширину в качестве аргумента printf.

Примерно так:

printf("%s%*s: \n", "Onaltılık", 5, "");  // 5 = 14 - 9, where 9 is the number of "characters" in Onaltılık
printf("%s%*s: \n", "Onluk"    , 9, "");  // Dito for Onluk
printf("%s%*s: \n", "İkilik"   , 8, "");  // Dito for İkilik

Вывод:

Onaltılık     : 
Onluk         : 
İkilik        : 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...