C语言 sscanf 和 sprintf函数的说明和使用
sprintf:
int sprintf( char *buffer, const char *format [, argument] … ); 功能:把格式化的数据写入buffer容器中(字符串),返回buffer的长度。这里s为一个buffer,类型为字符数组名或者字符指针(需要初始化)。
sprintf(s, "%d", 123); //产生"123"sprintf(s, "%8d%8d", 123, 4567); //产生:" 123 4567"(123前5个字符宽,4567前4个字符宽)
sprintf(s,"%m.ns",cp);//这里m为m个字符宽,如果输出的多于m个字符,则按实际需要分配宽度,如果少于m个字符则在左边(-m.n时在右边,此时是左对齐)补足不够的字符数的宽度。n为截取cp的前n个字符,后面补'\0'。在格式化到s中时都将加有'\0'结束符。该函数的实际执行过程是:将s和format地址递加,逐个赋值,即:s[i]=format[i](i=0,1,2,……)。
另外,s如果为数组,跟数组的长度没关系,也就是不会出现值溢出问题,因为这里取的只是首地址,字符多于一个时,首地址递加。当然不管用printf还是sprintf打印到屏幕和打印到字符串中,都是遇'\0'结束的。相反,如果字符数组没有'\0',调用printf或者sprintf时会出现未知数据。因为函数是直到遇到空字符结束的。
sscanf:
sscanf() - 从一个字符串中读进与指定格式相符的数据.
函数原型:
int sscanf( string str, string fmt, mixed var1, mixed var2 ... );
int scanf( const char *format [,argument]... );
说明:
sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。
其中的format可以是一个或多个 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '\t' | '\n' | 非%符号}
注:
1、 * 亦可用于格式中, (即 %*d 和 %*s) 加了星号 (*) 表示跳过此数据不读入. (也就是不把此数据读入参数中)
2、{a|b|c}表示a,b,c中选一,[d],表示可以有d也可以没有d。
3、width表示读取宽度。
4、{h | l | I64 | L}:参数的size,通常h表示单字节size,I表示2字节 size,L表示4字节size(double例外),l64表示8字节size。
5、type :这就很多了,就是%s,%d之类。
6、特别的:%*[width] [{h | l | I64 | L}]type 表示满足该条件的被过滤掉,不会向目标参数中写入值
支持集合操作:
%[a-z] 表示匹配a到z中任意字符,贪婪性(尽可能多的匹配)
%[aB'] 匹配a、B、'中一员,贪婪性
%[^a] 匹配非a的任意字符,贪婪性
注意:在读入的字符串是空字符串时,sscanf函数并不改变待读入到的字符串的值。
版权声明:本文为博主原创文章,未经博主允许不得转载。