今天学习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;
}