我正在尝试使用宽度说明符和printf函数格式化c中某些字符串的输出.但是我无法获得我想要的行为.似乎每次printf遇到字符å,ä或ö时,为字符串保留的宽度会缩小一个位置.
代码片段说明:
#include <stdio.h>
int main(void)
{
  printf(">%-10s<\n", "aoa");
  printf(">%-10s<\n", "aäoa");
  printf(">%-10s<\n", "aäoöa");
  printf(">%-10s<\n", "aäoöaå");
  return 0;
}
在我的ubuntu linux bash-shell中输出.
>aoa       <
>aäoa     <
>aäoöa   <
>aäoöaå <
我正在寻找有关如何处理这个问题的建议.我想要的是上面代码片段中的所有字符串都在空格填充的10字符宽字段中打印,如下所示:
>aoa       <
>aäoa      <
>aäoöa     <
>aäoöaå    <
如果这不是其他设置的问题,我也很感激有关为什么会发生这种情况或反馈的任何见解.
使用宽字符串和wprintf:
#include <cwchar>
#include <locale.h>
int main(void)
{
  // seems to be needed for the correct output encoding
  setlocale(LC_ALL, "");
  wprintf(L">%-10ls<\n", L"aoa");
  wprintf(L">%-10ls<\n", L"aäoa");
  wprintf(L">%-10ls<\n", L"aäoöa");
  wprintf(L">%-10ls<\n", L"aäoöaå");
  return 0;
}
为什么会这样?
看看绝对最低每个软件开发人员,绝对必须知道Unicode和字符集
作为宽字符和UTF8的替代方法,您可以使用此函数计算非ASCII字符的数量,然后,您可以将结果添加到宽度说明符printf:
#include <stdio.h>
int func(const char *str)
{
    int len = 0;
    while (*str != '\0') {
        if ((*str & 0xc0) == 0x80) {
            len++;
        }
        str++;
    }
    return len;
}
int main(void)
{
    printf(">%-*s<\n", 10 + func("aoa"), "aoa");
    printf(">%-*s<\n", 10 + func("aäoa"), "aäoa");
    printf(">%-*s<\n", 10 + func("aäoöa"), "aäoöa");
    printf(">%-*s<\n", 10 + func("aäoöaå"), "aäoöaå");
    return 0;
}
输出:
>aoa       <
>aäoa      <
>aäoöa     <
>aäoöaå    <