【吴从周课程】格式化输出函数

格式化输出函数
格式化输出函数指的是以printf为基础拓展开的几个格式化输出函数,

格式化输出函数
printf(格式化说明符,参量表)
sprintf(str字符数组,格式化说明符,参量表)
snprintf(str字符数组,N,格式化说明符,参量表) linux下输出的是N-1个
fprintf(fp文件指针,格式化说明符,参量表)
可以看到,printf函数是基础,格式化说明符这个参数是都有的,因此下面先学习格式化说明符(参量表只需要根据说明符填写相应的变量名即可)

格式化说明符
%[flags][width][.prec] type
方括号内为可选项
flags 对齐标志 缺省+(缺省就是默认而不用注明的方式)
width 宽度
prec 精度 四舍五入,注意精度问题
type 类型符 %e科学计数 short %hd long(%ld或%d)double用%lf或%f

C语言多行书写:
在实际开发中有时候一条输出语句会很长,用多行书写,会让程序更加清晰。
1.加\ 会把下一行也拼接起来

2."" “” “” 会把引号内的拼接起来

解析XML字符串的函数:
XML也是一种标记语言,用XML来存储内容好处是可读性、可扩展性强,缺点是由于要将标记存入,浪费内存,但是如今内存不值钱,所以XML被广泛运用。
以下是一个XML示例:

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

如果给出一个XML字符串,怎样用程序找到给定字段的内容呢?
比如给出上面那个XML字符串,我要找到name字段的内容:西施,怎么编写函数实现?综合利用sprintf、strstr、strncpy可以实现。
以下给出了这个XML字符串解析函数的原型、功能、示例、思路及实现源码。

函数原型:
int GetXMLBuffer
(const char *in_XMLBuffer,const char *in_FieldName,char *out_Value);

功能:
调用时写入XML字符串、需要获取的字段名、相应字段存入的字符指针,实现提取XML字符串中相应字段的内容,输出到字符指针指向的变量中去。

示例:

char strXMLBuffer[300],strValue[51];
memset(strXMLBuffer,0,sizeof(strXMLBuffer));  //先用memset清空,养成良好习惯
strcpy(strXMLBuffer,"<name>西施</name><age>18</age><sc>火辣</sc><yz>漂亮</yz>");
memset(strValue,0,sizeof(strValue));
GetXMLBuffer(strXMLBuffer,"name",strValue);
printf("strValue=%s\n",strValue);

实现思路:
1.首先定义两个字符串变量放<字段名> 和</字段名> 这两个字符串变量,用sprintf把字段名加上括号输出到定义的字符串变量中
2.再定义两个字符指针start和end,用strstr分别截取前面定义的两个字段名变量,然后赋值给start和end,此时start的内容是第一个字段名变量到XML字符串结尾,
end的内容是第二个字段名变量到XML字符串结尾
3.最后用strncpy,三个参数,
第一个参数是要存入的字符指针,
第二个参数是start+strlen(第一个字段名变量) 也就是说是该字段内容的开始部分,第三个参数是end-start-strlen(第二个字段名变量) 即字段内容的大小
4.返回值:
如果XML中压根没有想要的字段,就返回-1,
能找到的话,返回1

实现代码:

int GetXMLBuffer(const char *in_XMLBuffer,const char *in_FieldName,char *out_Value)
{
char bfieldname[51],efieldname[51];

memset(bfieldname,0,sizeof(bfieldname));
memset(efieldname,0,sizeof(efieldname));
sprintf(bfieldname,"<%s>",in_FieldName);
sprintf(efieldname,"</%s>",in_FieldName);

char *start,*end;
start=end=0;
start=strstr(in_XMLBuffer,bfieldname);
end=strstr(in_XMLBuffer,efieldname);
if(start==0||start==0)
return -1;

int len=end-start;
strncpy(out_Value,start+strlen(bfieldname),end-start-strlen(bfieldname));

return 1;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

农民真快落

我琢磨着也没人给我打赏呀。。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值