c语言学习格式化输出

宽度 控制输出内容的宽度

#include<stdio.h>
#include<string.h>
int main ( )
{
  int  a;
  a=2;

  double c=0;
  c=3;
  char b[10];
  memset(b,0,sizeof(b));
  strcpy(b,"gfd");
                               //输出对比
  printf("宽度是%d\n",a);
  printf("宽度是%12d\n",a);
  printf("宽度是%lf\n",c);
  printf("宽度是%12lf\n",c);
  printf("宽度是%s\n",b);
  printf("宽度是%12s\n",b);

  return 0;
}
宽度是2
宽度是           2
宽度是3.000000
宽度是    3.000000
宽度是gfd
宽度是         gfd

对齐标志

不填或者+就是右对齐  上面代码就是右对齐    左对齐  %-12d   要加负号

 

#include<stdio.h>
#include<string.h>
int main ( )
{
  int  a;
  a=2;

  double c=0;
  c=3;
  char b[10];
  memset(b,0,sizeof(b));
  strcpy(b,"gfd");
                               //全部左对齐
  printf("宽度是=%-d=\n",a);
  printf("宽度是=%12-d=\n",a);
  printf("宽度是=%-lf=\n",c);
  printf("宽度是=%-12lf=\n",c);
  printf("宽度是=%-s=\n",b);
  printf("宽度是=%-12s=\n",b);

  return 0;
}
宽度是=2=
宽度是=%12-d=
宽度是=3.000000=
宽度是=3.000000    =
宽度是=gfd=
宽度是=gfd         =

输出内容是右对齐的话 ,可以在前面加0  整数和浮点数可以    字符串不能在前面填0。代码如下  

#include<stdio.h>
#include<string.h>
int main ( )
{
  int  a;
  a=2;

  double c=0;
  c=3;
  char b[10];
  memset(b,0,sizeof(b));
  strcpy(b,"gfd");

  printf("宽度是=%d=\n",a);
  printf("宽度是=%012d=\n",a);
  printf("宽度是=%lf=\n",c);
  printf("宽度是=%012lf=\n",c);
  printf("宽度是=%s=\n",b);
  printf("宽度是=%012s=\n",b);

  return 0;
}
宽度是=2=
宽度是=000000000002=
宽度是=3.000000=
宽度是=00003.000000=
宽度是=gfd=
宽度是=         gfd=

由结果可以看出 字符串  不能在前面补0  就算强行补0  输出的结果也是字符串

左对齐时 整数和浮点数 不能在后面补0      

浮点数的精度

#include<stdio.h>
#include<string.h>
int main ( )
{
  double dd;
  dd=11000000000;
 printf("输出结果是=%lf=\n",11.8);
 printf("输出结果是=%.1lf=\n",11.8);
 printf("输出结果是=%.2lf=\n",11.8);
 printf("输出结果是=%.3lf=\n",11.8);
 printf("输出结果是=%e=\n",dd);
 printf("输出结果是=%.2e=\n",dd);
  return 0;

 

输出结果是=11.800000=
输出结果是=11.8=
输出结果是=11.80=
输出结果是=11.800=
输出结果是=1.100000e+10=
输出结果是=1.10e+10=

注意     四舍五入时 箭头所指 因为是浮点数 计算机可能识别为12.5049999所以没有  五入    解决办法是见第二张代码图

解决办法在505后面加上一个数字就可以了

格式化输出到字符串

        int printf(const char *format, ...);

     可变参数:eg:printf("%d,%lf,%c.%s\n",int,double,char,"aa");

类型符汇总:

                %hd  %d   %ld  以十进制、有符号的形式输出short、 int、long类型的整数

                 %hu   %u  %lu 以十进制无符号形式输出short、int、long类型的整数。

                %c  输出字符      %e以科学计数法输出double型 

                 %s输出字符串。

       int sprintf(char *str, const char *format, ...);

       int snprintf(char *str, size_t size, const char *format, ...);

       函数的功能:1.   printf是把结果输出到屏幕,2.  sprintf把格式化输出的内容保存到字符串str中,3.   snprintf的n类似于strncpy中的n,意思是只获取输出结果的前n-1个字符,不是n个字符。   区别:在windows下  会截取n个

 代码如下:

#include<stdio.h>
#include<string.h>
int main ( )
{
  char str[301];  //定义一个字符串
 printf("输出结果是=%d,%s,%lf,%c=\n",10,"美女",9.8,'a'); //对比
 sprintf(str,"%d,%s,%lf,%c",10,"美女",9.8,'a');    //格式化字符串并赋值
 printf("%s\n",str);                              //打印出赋值后的字符串
 snprintf(str,10,"%d,%s,%lf,%c",10,"美女",9.8,'a'); //给字符串赋前n-1个值
 printf("%s\n",str);
  return 0;
}
出结果是=10,美女,9.800000,a=
10,美女,9.800000,a
10,美女,9

c语言多行书写:

整数和浮点数不行

适用于浮点数赋值

#include<stdio.h>
#include<string.h>
int main ( )
{
  char ii[20];
  memset(ii,0,sizeof(ii));
  strcpy(ii,"zxcvbnm"\
             "abcde");
  printf("%s\n",ii);
  return 0;

}
zxcvbnmabcde

解析XML字符串函数

/*
函数声明:

       int  GetXMLBuffer(const char *in_XMLBuffer,const char *in_FieldName,char *out_Value);

       in_XMLBuffer,XML格式的字符串,如下:

       <name>西施</name><age>18</age><sc>火辣</sc><yz>漂亮</yz>

       in_FieldName,字段的标签名。

       out_Value,获取内容存放的变量的指针。

       返回值,0-成功,-1-失败。*/
#include<stdio.h>
#include<string.h>
int  GetXMLBuffer(const char *in_XMLBuffer,const char *in_FieldName,char *out_Value);
int main ( )
{
   char strXMLBuffer[301],strValue[51];    //定义两个字符串
   memset(strXMLBuffer,0,sizeof(strXMLBuffer));   //初始化
   memset(strValue,0,sizeof(strValue));
    //给strXMLBuffer赋值
   strcpy(strXMLBuffer,"<name>西施</name><age>18</age><sc>火辣</sc><yz>漂亮</yz>");
   //调用GetXMLBuffer  函数  输入  name  得到结果    西施
   GetXMLBuffer(strXMLBuffer,"name",strValue);  

   printf("strXMLBuffer=%s\n",strValue);   // 输出结果


   memset(strValue,0,sizeof(strValue));      
   GetXMLBuffer(strXMLBuffer,"age",strValue);  //给age 然后得到  18

   printf("strXMLBuffer=%s\n",strValue);


   memset(strValue,0,sizeof(strValue));
   GetXMLBuffer(strXMLBuffer,"sc",strValue);

   printf("strXMLBuffer=%s\n",strValue);


   memset(strValue,0,sizeof(strValue));
   GetXMLBuffer(strXMLBuffer,"yz",strValue);

   printf("strXMLBuffer=%s\n",strValue);

 }

int  GetXMLBuffer(const char *in_XMLBuffer,const char *in_FieldName,char *out_Value)
{

  char *start,*end;  //定义两个指针变量
  start=end=0;  //初始化
  char bfieldname[51],efieldname[51];  //定义两个字符串

  memset(bfieldname,0,sizeof(bfieldname));  //初始化
  memset(efieldname,0,sizeof(efieldname));

  sprintf(bfieldname,"<%s>",in_FieldName);  // 格式化输出的内容存到bfieldname
  sprintf(efieldname,"</%s>",in_FieldName);  // 格式化输出的内容存到efieldname


  start=strstr(in_XMLBuffer,bfieldname);  //查找到name,并输出之后的全部内容
   //在in_XMLBuffer查找bfieldname所存的内容并把结果给start

  end=strstr(in_XMLBuffer,efieldname);
     //在in_XMLBuffer查找efieldname所存的内容并把结果给end
 
  if((start==0)||(end==0))  return -1;   //判断  如果为空则返回  失败


  strncpy(out_Value,start+strlen(bfieldname),end-start-strlen(bfieldname));
 //否则 在start中的start+strlen(bfieldname)这个起始位置截取
  // end-start-strlen(bfieldname这么多个长度

  return 1;  //  成功 返回1  
strXMLBuffer=西施
strXMLBuffer=18
strXMLBuffer=火辣
strXMLBuffer=漂亮

 

1、编写一个程序,把超女结构体数据拼成一个XML字符串,超女结构体如下:

struct st_girl
{
  char name[51];   // 姓名
  int  age;        // 年龄
  int  height;     // 身高,单位:cm
  double weight;     // 体重,单位:kg
  char sc[31];     // 身材,火辣;普通;飞机场
  char yz[31];     // 颜值,漂亮;一般;歪瓜裂枣
};
//XML格式的字符串如下:

<name>西施</name><age>18</age><height>168</height><weight>48.5</weight><sc>火辣</sc><yz>漂亮</yz>

 

2、编写解析XML字符串的函数族,解析XML字符串。

函数声明:

// 解析XML字符串的函数族,支持int、char *和double三种类型。
// 返回值:0-成功,-1-失败。
int GetXMLBuffer_Int(const char *in_XMLBuffer,const char *in_FieldName,int *out_Value);
int GetXMLBuffer_Str(const char *in_XMLBuffer,const char *in_FieldName,char *out_Value);
int GetXMLBuffer_Double(const char *in_XMLBuffer,const char *in_FieldName,double *out_Value);
/*in_XMLBuffer,XML格式的字符串,如下:

<name>西施</name><age>18</age><height>168</height><weight>48.5</weight><sc>火辣</sc><yz>漂亮</yz>
in_FieldName,字段的标签名。

out_Value,获取内容存放的变量的指针。

//返回值,0-成功,-1-失败。

//调用示例:

  char strXMLBuffer[1024]; memset(strXMLBuffer,0,sizeof(strXMLBuffer));
  strcpy(strXMLBuffer,"<name>西施</name><age>18</age><height>168</height><weight>48.5</weight><sc>火辣</sc><yz>漂亮</yz>");
 
  char name[51];  memset(name,0,sizeof(name));
  int  age=0;
  double weight=0;
 
  GetXMLBuffer_Str(strXMLBuffer,"name",name); // name的内容将是"西施"
  GetXMLBuffer_Int(strXMLBuffer,"age",&age); // age的内容将是18
  GetXMLBuffer_Double(strXMLBuffer,"sc",&weight); // weight的内容将是48.5*/

xml解析函数演示:

思考的点:

1、自定义函数类型决定着函数返回值的类型 如:int xml  函数成功返回值为1,失败返回值为0;

2、结构体初始化:memset(&结构体变量名,0,sizeof(结构体名));

3、strstr函数:strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。

4、xml函数中out为指针变量,所以直接传递出在xml函数中所赋的值。

系统会为变量分配内存,也会为常量分配内存,有内存就有地址,

  char *pstr="西施";
  printf("pstr=%p\n",pstr);
  printf("pstr=%s\n",pstr);  // 不会出现段错误(Core dump)
  strcpy(pstr,"杨玉环");  // 会出现段错误(Core dump)

5、运用指针的加减,来获得需要的东西。

6、char *out为字符型指针存放字符型变量。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int xml(const char *cr,const char *dc,char *out);
struct in
{
	char    name[31];
	int     hou;
	double  chang;
	char    where[31];
	char    zh[31];
}ha;
int main()
{
    
	memset(&ha,0,sizeof(struct in));
	
	char fl[1000];
	char f2[1000];
	memset(f2,0,sizeof(f2));
	memset(fl,0,sizeof(fl));
	strcpy(fl,"<name>girl</name><hou>10</hou><chang>50</chang><where>清华大学</where>\
<zh>buzhidao</zh>");
	memset(f2,0,sizeof(f2));
	xml(fl,"name",f2);
	printf("1、fl=%s=\n",f2);
	
	memset(f2,0,sizeof(f2));
    xml(fl,"hou",f2);
	printf("2、fl=%s=\n",f2);
	return 0;
}
int xml(const char *cr,const char *dc,char *out)
{
	char ii[300];
	char jj[300];
	memset(ii,0,sizeof(ii));
	memset(jj,0,sizeof(jj));
	
	sprintf(ii,"<%s>",dc);
	sprintf(jj,"</%s>",dc);
	
	char *ip1,*ip2;
	ip1=strstr(cr,ii);
	ip2=strstr(cr,jj);
	
	strncpy(out,ip1+strlen(ii),ip2-ip1-strlen(ii));
	return 1; 
}

 

 

 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值