C语言中几个常用的函数总结

感觉这几个函数功能还是很强大的,有必要总结一下,主要是从网上摘抄的。

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.h>
 
函数功能:将字符串string中所有在seps中出现的分隔符替换掉。
 
返回说明:返回指向下一个标记串。当没有标记串时则返回空字符NULL。

其它说明:

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

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

实例:

/* MSDN提供 */
#include <string.h>
#include 
<stdio.h>

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: */
   }

}

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值