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

来源:百度文库 编辑:神马文学网 时间:2024/06/13 13:11:41
感觉这几个函数还是很强大的,有必要总结一下,主要是从网上摘抄的。
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