一、简介
在平时的使用中,会经常使用到printf进行打印,而最长使用的方式是printf("%s",string)进行打印。但是有个问题,如果string结尾不是0。那么printf会继续打印,直到遇到0为止。这样就会有内存溢出的风险。显然,这种是不符合预期的。所以,此时就需要%*s出来帮忙了。
二、功能介绍
printf("%s",string)
打印字符串,遇到0停止。
printf("%*s",10,string)或printf("%10s",string)
打印字符串,至少占用10个字节。如果不够,则在左侧补0,如果超过10个,则按实际长度。
printf("%.*s",10,string)或printf("%.10s",string)
打印字符串,最多占10个字节。如果不够,则按实际长度,如果超过10个,则只打印10个。
printf("%-*s",10,string)或printf("%-10s",string)
打印字符串,至少占用10个字节,如果不够,则在右侧补0,如果超过10个,则按实际长度。
注:%-s只是改变了对齐的方向。正常是右对齐,加上“-”后,为左对齐。
三、实例
见如下代码,这里我们分别以%*s、%.*s和%-*s三种方式进行打印。
char *string1 = "this is a test string";
uint8_t len = strlen(string1);
printf("len:%d,%s\r\n",len,string1);
printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\r\n");
printf("%15s|\r\n%*s|\r\n%-30s|\r\n",string1,30,string1,string1);
printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\r\n");
printf("%.15s|\r\n%.*s|\r\n%-.30s|\r\n",string1,30,string1,string1);
printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\r\n");
看结果:
可以看到,要打印的字符串长度为21字节。%*s打印,如果要打印的长度大于设置的长度,则打印实际长度。而%.*s打印,如果要打印的长度大于设置的长度,则只打印设置的长度。而%-*s只是将右对齐改变成了左对齐。