今天很偶然的注意到int sprintf( char *buffer,const char *format [,argument] ... );这个定义。
我们知道:
1.char *str;就是定义一个字符指针,一般用来表示字符串(它指向字符串的首字符);
2.字符串都是以'\0'结尾表示的;
3.C里面表示内存块指针一般用void *;
第一个问题:
那么,如果单从函数来看buffer应该是是一个字符串,但是实际使用仅仅只是一个用来存结果数据的缓存(内存块)。也即:
char buf[16];///仅仅是一块缓存
sprintf( buf,”%s”,”content” );
而不是
char buf[16] =””;///字符串,有'\0'结尾
sprintf( buf,”%s”,”content” );
那么是不是应该这样定义更好?——int sprintf( void *buffer,const char *format [,argument] ... );
类似的函数还有strcpy、strncpy。
第二个问题:
char *strncpy( char *strDest,const char *strSource,size_t count );将源字符串copy多少个到缓存strDest。如果count大于strSource的长度,会自动给strDest补零;但是,如果小于等于strSource的长度呢?那么就没有补零的操作了,也就是返回的并不是一个'\0'结尾的字符串了。
如果仅仅这个功能,完全可以memset了0,然后再memcpy的,而且这样的效率也要比用strncpy的高。
为什么不是要求strDest的大小必须大于等于count+1呢?那么当copy了count个字符后,自动尾上补零,确保肯定是一个字符串。这才肯定是字符串操作,而且功能也不重复。