16-8-30问题

来源:互联网 发布:网吧电脑优化 编辑:程序博客网 时间:2024/06/06 18:23

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

}

0 0
原创粉丝点击