sprintf() 格式化输出函数(图形)

来源:百度文库 编辑:神马文学网 时间:2024/05/06 09:15:13
感觉这几个函数功能还是很强大的,有必要总结一下,主要是从网上摘抄的。

  1.sprintf函数

  sprintf() 格式化输出函数(图形)

  功能: 函数sprintf()用来作格式化的输出。

  用法: 此函数调用方式为int sprintf( char *buffer, const char *format [, argument] ... );

  说明: sprintf 跟printf 在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,

  后者则直接在命令行上输出。

  sprintf 是个变参函数,但它的的前两个参数固定,而且精华也在它的第二个参数上面,第一个参数是输入到的指定字符串。需要注意的是如果不指定这个参数,执行过程中出现 "该程序产生非法操作,即将被关闭...."的提示。因为C语言在进行字符串操作时不检查字符串的空间是否够大,所以可能会出现数组越界而导致程序崩溃的问题。即使碰巧,程序没有出错,也不要这么用,因为早晚会出错。所以一定要在调用sprintf之前分配足够大的空间给buf。

  其他的一些功能:自《CSDN 社区电子杂志——C/C++杂志》

  (1)格式化数字字符串

  也就是把整数打印到字符串里去,这样用来实现整数到字符串的转换。可以代替itoa这个函数

  //把整数123 打印成一个字符串保存在s 中。

  sprintf(s, "%d", 123); //产生"123"

  可以指定宽度,不足的左边补空格:

  sprintf(s, "%8d%8d", 123, 4567); //产生:" 123 4567"注意这里123前有5个空格4567前有4个空格

  当然也可以左对齐:

  sprintf(s, "%-8d%8d", 123, 4567); //产生:"123 4567"

  也可以按照16 进制打印:

  sprintf(s, "%8x", 4567); //小写16 进制,宽度占8 个位置,右对齐

  sprintf(s, "%-8X", 4568); //大写16 进制,宽度占8 个位置,左对齐

  (2)控制字符串打印精度

  浮点数的打印和格式控制是sprintf 的又一大常用功能,浮点数使用格式符”%f”控制,默认保

  留小数点后6 位数字,比如:

  sprintf(s, "%f", 3.1415926); //产生"3.141593"

  但有时我们希望自己控制打印的宽度和小数位数,这时就应该使用:”%m.nf”格式,其中m表

  示打印的宽度,n 表示小数点后的位数。比如:

  sprintf(s, "%10.3f", 3.1415626); //产生:" 3.142"

  sprintf(s, "%-10.3f", 3.1415626); //产生:"3.142 "

  sprintf(s, "%.3f", 3.1415626); //不指定总宽度,产生:"3.142"

  int i = 100;

  sprintf(s, “%.2f”, i); //这个结果是会让你很失望的,要想得到100.00必须强制转换(double)i会打出什么东东来?“100.00”?对吗?

  (3)第二个较常用的用法是连接字符串

  sprintf的格式控制串中既然可以插入各种东西,并最终把它们“连成一串”,自然也就能够连接字符串,从而在许多场合可以替代strcat,但sprintf能够一次连接多个字符串(自然也可以同时在它们中间插入别的内容,总之非常灵活)。比如:

  char* who = “I”;

  char* whom = “CSDN”;

  sprintf(s, “%s love %s.”, who, whom); //产生:“I love CSDN. ”

  strcat只能连接字符串(一段以’\0’结尾的字 符数组或叫做字符缓冲,null-terminated-string),但有时我们有两段字符缓冲区,他们并不是以’\0’结尾。比如许多从第三方库函 数中返回的字符数组,从硬件或者网络传输中读进来的字符流,它们未必每一段字符序列后面都有个相应的’\0’来结尾。如果直接连接,不管是sprintf 还是strcat肯定会导致非法内存操作,而strncat也至少要求第一个参数是个null-terminated-string,那该怎么办呢?我们 自然会想起前面介绍打印整数和浮点数时可以指定宽度,字符串也一样的。比如:

  char a1[] = {’A', ‘B’, ‘C’, ‘D’, ‘E’, ‘F’, ‘G’};

  char a2[] = {’H', ‘I’, ‘J’, ‘K’, ‘L’, ‘M’, ‘N’};

  正确的写法是

  sprintf(s, “%.7s%.7s”, a1, a2);//产生:“ABCDEFGHIJKLMN”

  (4)打印地址

  sprintf提供了专门的”%p”:sprintf(s, “%p”, &i);

  (5)sprintf的返回值

  spritnf返回了本次函数调用最终打印到字符缓冲区中的字符数目。也就是说每当一次sprinf调用结束以后,你无须再调用一次strlen便已经知道了结果字符串的长度。如:

  int len = sprintf(s, “%d”, i); 对于正整数来说,len便等于整数i的10进制位数。

  2.sscanf函数

  名称: sscanf() - 从一个字符串中读进与指定格式相符的数据.

  语法: int sscanf( string str, string fmt, mixed var1, mixed var2 ... );

  用法: 以指定的格式 fmt 去解读字符串 str. fmt 中除了 %d 和 %s 以外, 亦可包含其他的字符串作为格式. 每一个 %d 或 %s 都对应一个参数, 按顺序为 var1, var2 ... %d 读入一个整数到参数中,而 %s 读入一个字符串.

  * 亦可用于格式中, (即 %*d 和 %*s) 加了星号 (*) 表示跳过此数据不读入. (也就是不把此数据读入参数中)

  常见用法。

  char buf[512] = ;

  sscanf("123456 ", "%s", buf);

  printf("%s\n", buf);

  结果为:123456

  2. 取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。

  sscanf("123456 ", "%4s", buf);

  printf("%s\n", buf);

  结果为:1234

  3. 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。

  sscanf("123456 abcdedf", "%[^ ]", buf);

  printf("%s\n", buf);

  结果为:123456

  4. 取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串。

  sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf);

  printf("%s\n", buf);

  结果为:123456abcdedf

  5. 取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。

  sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf);

  printf("%s\n", buf);

  结果为:123456abcdedf

  6、给定一个字符串iios/12DDWDFF@122,获取 / 和 @ 之间的字符串,先将 "iios/"过滤掉,再将非'@'的一串内容送到buf中

  sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf);

  printf("%s\n", buf);

  结果为:12DDWDFF

  7、给定一个字符串““hello, world”,仅保留world。(注意:“,”之后有一空格)

  sscanf(“hello, world”, "%*s%s", buf);

  printf("%s\n", buf);

  结果为:world

  %*s表示第一个匹配到的%s被过滤掉,即hello被过滤了

  如果没有空格则结果为NULL。

  我觉得这个函数掌握这么多久足够用了。跟正则表达式比的haunted,功能还是没有正则强大。这个函数还可以用来分割字符串,例如:char ch1[3],ch2[4],ch3[4];

  sscanf("12345678","%2s%3s%3s",ch1,ch2,ch3);

  还可以把字符串转换为数值型

  char num[5]=“164.4”;

  float force;

  sscanf(num,"%6f",&force); //这里force=164.4;

  3.strtok函数

  函数原型:extern char *strtok(char *string, char *seps)

  参数说明:string为源字符串,seps为指定的分隔符,是一个分隔字符串的集合。

  所在库名:#include

  函数功能:将字符串string中所有在seps中出现的分隔符替换掉。

  返回说明:返回指向下一个标记串。当没有标记串时则返回空字符NULL。

  其它说明:

  当第一次调用strtok函数的时候,strtok函数跳过seps中的第一个分隔符,同时返回在string中的出现的第一个分隔符的位置的指针,用一个空字符'\0'终止。

  通过循环,经过多次调用strtok函数,seps中更多的分隔字符都会被'\0'替换掉,最终输出我们意图实现的字符串。

  实例:

  /**//* MSDN提供 */

  #include

  #include

  char string[] = "A string\tof ,,tokens\nand some more tokens";

  char seps[] = " , \t\n";

  char *token;

  void main( void )

  ...{

  printf( "%s Tokens: ", string );

  token = strtok( string, seps ); /**//* Establish string and get the first token: */

  while( token != NULL )

  ...{

  printf( " %s ", token ); /**//* While there are tokens in "string" */

  token = strtok( NULL, seps ); /**//* Get next token: */

  }

  }

  本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/amossavez/archive/2009/07/19/ 4361535.aspx