【发布时间】:2019-07-23 12:33:49
【问题描述】:
我有以下代码以左对齐格式在控制台上打印一些字符串:
#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 :
谁能帮我找出问题所在?
【问题讨论】:
-
您是否尝试过设置
setlocale(LC_ALL,"");并使用puts()打印字符串? -
strlen("Onaltılık)"与strlen("Onaltilik)"在两个平台上的回报是什么? -
也许尝试在你的字符串前加上
L?像这样:L"Turkish characters" -
@Jabberwocky 从下面的答案中我了解到,当存在包含非 ASCII 字符的字符串时,如“Onaltılık”strlen 或 printf 不会返回正确的结果。 strlen("Onaltılık") 的预期结果是 9,但它返回 11。我认为这是因为字符串中有两个 'ı' 字符,它是一个非 ASCII(多字节)字符。