我有一个代码,打算在字符串后面打印一些空格(以删除最终会出现的内容,因为我移动了光标)。
所以,我使用了这样的东西:
int some_length = 0;
char some_string[]="hello world";
printf( "%*c%s\n", some_length, ' ', some_string );
我认为会产生"你好世界",但不,它产生"你好世界" (请注意,在我的真实代码中,空格是在字符串后面打印的,因为目标是擦除,而不是缩进,我只是在这里做这个以获得工作样本。)
那么,这种行为是否打算?由于some_length是0,人们可以合理地希望什么都不打印,对吗?这是一个未定义的行为,还是可能是标准的lib(我怀疑它,但是......)?
答案 0 :(得分:6)
printf的*修饰符用于指定生成的下一个输出长度的变量最小宽度,而不是固定宽度的长度产生的下一个产出。因此,如果使用*并提供0作为长度的数值,则它将无效,因为它表示“打印空格字符,并且永远不会打印少于零个字符。”
答案 1 :(得分:1)
我认为你忘记了%*的含义。如果你查一下,它告诉编译器“我想打印至少这么多宽度。所以,如果你把零,就好像什么也没发生,因为它显然可以打印1个字符宽度。
如果说你将数字更改为5,它会用5个空格填充它,因为需要打印至少 5个宽度。