我有以下代码以左对齐格式在控制台上打印一些字符串:
#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");
}
我在Ubuntu 18.04系统上同时使用gcc(7.3.0)和clang(6.0.0)编译了这段代码。
输出如下:
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 :
如果我在带有gcc(CodeBlocks 17.2中的MinGW v5.1.1)的Windows系统(Windows 7)上编译相同的代码,则输出正确如下:
Türkçe karakterler ile:
Onaltılık :
Onluk :
İkilik :
Türkçe karakterler olmadan:
Onaltilik :
Onluk :
Ikilik :
有人可以帮我找出问题所在吗?
答案 0 :(得分:2)
我的猜测是,因为您的编辑器使用UTF-8(一种多字节编码)保存了源。 printf
函数家族仅处理 byte 字符串。这意味着printf
将把每个非ASCII字符计为多个字符。
如果是这样,可以通过打印字符串来解决此问题,然后在打印空字符串时使用*
修饰符后手动添加填充。 *
修饰符允许您将宽度作为参数传递给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 :