我正在尝试使用宽度说明符和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å <
如果这不是其他设置的问题,我也很感激有关为什么会发生这种情况或反馈的任何见解.
解决方法
为什么会这样?
作为宽字符和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å <