You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:50:19