以下内容针对C语言
做软件的应该没有不知道printf函数吧!
printf("hello world !\n");
日前,看到一个奇怪的printf打印:
mqtt_log("%.*s - %.*s", len_1, chr_1, len_2, chr_2); // mqtt_log是printf的重定义
输出例子:
hello - world
我心想这是什么鬼,也不是常见的数字位数限制啊,整形变量len_1和len_2有啥用?所以我给人“优化”了:
mqtt_log("%s - %s", chr_1, chr_2);
改完也没注意,结果今天突然发现,输出的log有重复内容,比如:
helloworld - world
仔细想了想,发现了端倪。因为char型指针chr_1和chr_2是连续的内存,且chr_1最后没有字符串结束符,而chr_2有。所以打印chr_1的时候会连带chr_2的内容一块输出了,造成打印信息重复。
其实,“.*” 表示字符串输出宽度限制,这个限制量可以作为printf的参数来指定!
回到这个例子,len_1就是指定chr_1的最大长度,len_2指定chr_2的最大长度。这样,碰到没有字符串结束符的指针,就不会打印多余的数据了。
引用一句伟人说过的话提醒自己: 不懂的代码千万不要改!
网友评论