16-8-30问题

今天学习c的时候遇到了第一个想不通的问题

题目内容:编写一个程序,先提示用户输入名,然后提示用户输入姓。在一行打印用户输入的名和姓,下一行分别打印名和姓的字母数。字母数要与相应的名和姓的结尾对齐,如下:

Justinbieber

        6           6

接下来,再打印相同的信息,但是字母个数与相应名和姓的开头对齐,如下:

JustinBieber

6         6

 

刚开始的思路:通过strlen()函数来确定名和姓的字符数,再通过%Xd的形式使输出的字符数来实现左对齐或右对齐,但遇到了一个问题,即strlen()的返回值无法表示在%Xd的形式中。

 

卡壳原因分析:看书时没有充分注意到书上内容的细节,具体为程序清单4.16 varwid.c程序中,关于%*d的使用。

 

解题思路:在%*d情况下,后边提供两个变量,第一个提供字段宽度,第二个提供变量内容。

具体代码如下:

#include<stdio.h>

#include<string.h>

Intmain(void)

{

       char firstname[10],lastname[10];

       int width1,width2;

      width1=strlen(firstname);

      width2=strlen(lastname);

      scanf("%s%s",firstname,lastname);

      printf("%s%s\n",firstname,lastname);

      printf("%*d%*d\n",width1,width1,width2,width2);

     printf("%s%s\n",firstname,lastname);

     printf("%-*d%-*d",width1,width1,width2,width2);

 

     return 0;

}

第一次调试后发现strlen读入数值一直为1,再次检查后发现width1=strlen()的函数放在了scanf之前,导致输入之前便被赋值,为粗心错误,第二次犯了,要注意!!!!

 

更改后:

#include<stdio.h>

#include<string.h>

int main(void)

{

       char firstname[10],lastname[10];

       int width1,width2;

      scanf("%s%s",firstname,lastname);

      width1=strlen(firstname);

      width2=strlen(lastname);

      printf("%s%s\n",firstname,lastname);

      printf("%*d%*d\n",width1,width1,width2,width2);

     printf("%s%s\n",firstname,lastname);

     printf("%-*d%-*d",width1,width1,width2,width2);

 

     return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值