c语言程序常用的用函数,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中所有在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

3466307_1.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值