宽度 控制输出内容的宽度
#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;
}