printf中的宽度说明符与重音字符无法正常工作

前端之家收集整理的这篇文章主要介绍了printf中的宽度说明符与重音字符无法正常工作前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试使用宽度说明符和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å    <

如果这不是其他设置的问题,我也很感激有关为什么会发生这种情况或反馈的任何见解.

解决方法

为什么会这样?

看看The Absolute Minimum Every Software Developer Absolutely,Positively Must Know About Unicode and Character Sets

作为宽字符和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å    <
原文链接:https://www.f2er.com/c/117536.html

猜你在找的C&C++相关文章