今天看一段代码,有个sprintf函数一下有点儿蒙圈了,找了一圈资料,总结如下。
代码是从一个字符串中截取前面指定长度子字符串,然后把尾部的空格删掉返回。
<函数测试>
void testCutTailSp(){
char tmp[11],*org="abc d efgab ";
memset( tmp, '\0', sizeof(tmp) );
cutTailSp(tmp,org,4);
printf("1tmp:%s|,org:%s|\n",tmp,org);
}
<截取子字符串函数>
int cutTailSp(char *tmp,char *org,int len){
int i;
sprintf(tmp,"%.*s",len,org);
printf("2tmp:%s|,org:%s|\n",tmp,org);
for(i=0;i<len;i++){
if(tmp[len-1-i]==' '){
tmp[len-1-i]='\0';
}
else break;
}
return(strlen(tmp));
}
该函数的结果是想取四个子字符串【abc 】,但因为最后一个是空格,所以又截掉了,
只返回【abc】了。
那么这个%.*s到底代表什么意思呢?
原来这个*s都是和后边的参数len,org一一对应的,分别代表取几个字符和从哪儿取。
其实完整的写法应该是这样的,
sprintf(tmp,"%*.*s\n",m,n,org);
**s和后边的参数m,n,org一一对应,表示从org里取n个字符,然后在tmp的前头加上m-n个空格。
要是m比n小,那就不加了。
如果m不写,说明m=n嘛。
有关sprintf/printf的完整格式串,请参照如下网页。