C语言长度间距问题:代码可运行但对其实现逻辑存疑
代码逻辑拆解与解释
嘿,我来帮你把这段代码的运行逻辑拆解得明明白白,尤其是你搞不懂的最后那行输出~
先把你的完整代码贴出来方便对照:
//变量定义 char FirstName[100]; char LastName[100]; //代码实现 printf("Please enter your first name: "); scanf("%s", FirstName); printf("Please enter your last name: "); scanf("%s", LastName); printf("%s %s\n", FirstName, LastName); printf("%d %*s %d", strlen(FirstName),(strlen(FirstName)-2),"", strlen(LastName));
前半部分(输入与基础输出)
这部分逻辑很直观:
- 定义了两个长度为100的字符数组,分别用来存储名字(FirstName)和姓氏(LastName)
- 用
printf给出输入提示,scanf("%s")读取输入的字符串(注意%s会自动跳过空格,只读取到下一个空格/换行前的内容,所以不能输入带空格的名字) - 第五行的
printf("%s %s\n", FirstName, LastName)就是把名字和姓氏用空格分隔,正常输出在一行
重点:最后一行的格式化输出逻辑
这是你疑惑的核心,咱们逐个拆解格式符和对应的参数:
%d:对应第一个参数strlen(FirstName),直接输出名字的长度(比如输入"Alice",就输出5)%*s:这是C语言里的可变宽度字符串输出小技巧:*代表输出宽度由后面的参数决定,这里对应第二个参数strlen(FirstName)-2- 第三个参数是空字符串
"",因为空字符串本身没有内容,所以用指定宽度输出时,会自动用空格填充到指定宽度 - 简单说就是:输出(名字长度-2)个空格
- 最后的
%d:对应第四个参数strlen(LastName),输出姓氏的长度(比如输入"Smith",就输出5)
举个实际例子更清楚:
假设你输入的FirstName是"John"(长度4),LastName是"Doe"(长度3),那最后一行会输出:4 3
(中间的两个空格就是4-2=2的宽度填充出来的)
小提醒
如果你的名字长度小于2(比如输入"Li",长度2,那2-2=0,中间就没有空格;如果输入"A",长度1,那1-2=-1,这时候%*s的行为是未定义的,可能会输出奇怪的内容),所以实际使用时最好加个判断,避免出现负数宽度的情况~
内容的提问来源于stack exchange,提问作者VallyMan
相关产品推荐
相关产品推荐

