C语言sprintf与sscanf函数

时间:2022-09-04 07:53:39 其他范文 收藏本文 下载本文

C语言sprintf与sscanf函数(共5篇)由网友“魏沈蘑”投稿提供,以下是小编为大家整理后的C语言sprintf与sscanf函数,希望对您有所帮助。

C语言sprintf与sscanf函数

篇1:C语言sprintf与sscanf函数

1、前言

我们经常涉及到数字与字符串之间的转换,例如将32位无符号整数的ip地址转换为点分十进制的ip地址字符串,或者反过来,从给定的字符串中提取相关内容,例如给定一个地址:www.bokeyuan.cn:2345,我们要从地址中提出协议,主机地址和端口号。之前对字符串和数字之间的关系不是很熟悉,工作中经常涉及到这个,如是好好总结一下。C语言提供了一些列的格式化输入输出函数,最基本的是面向控制台标准输出和输入的printf和scanf,其实还有面向字符串的sprint和sscanf,面向文件的流的fprintf和fscanf。今天着重总结一下sprintf和sscanf系列函数,这两个函数类似于scanf和printf ,不同点是从字符串*buffer用于输入输出。

2、sprintf函数

sprintf函数原型为 int sprintf(char *str, const char *format, ...)。作用是格式化字符串,具体功能如下所示:

(1)将数字变量转换为字符串。

(2)得到整型变量的16进制和8进制字符串。

(3)连接多个字符串。

举例如下所示:

1 char str[256] = { 0 };

2 int data = 1024;

3 //将data转换为字符串

4 sprintf(str,“%d”,data);

5 //获取data的十六进制

6 sprintf(str,“0x%X”,data);

7 //获取data的八进制

8 sprintf(str,“0%o”,data);

9 const char *s1 = “Hello”;

10 const char *s2 = “World”;

11 //连接字符串s1和s2

12 sprintf(str,“%s %s”,s1,s2);

3、sscanf函数

sscanf函数原型为int sscanf(const char *str, const char *format, ...)。将参数str的字符串根据参数format字符串来转换并格式化数据,转换后的结果存于对应的参数内。具体功能如下:

(1)根据格式从字符串中提取数据。如从字符串中取出整数、浮点数和字符串等。

(2)取指定长度的字符串

(3)取到指定字符为止的字符串

(4)取仅包含指定字符集的字符串

(5)取到指定字符集为止的字符串

sscanf可以支持格式字符%[]:

(1)-: 表示范围,如:%[1-9]表示只读取1-9这几个数字 %[a-z]表示只读取a-z小写字母,类似地 %[A-Z]只读取大写字母

(2)^: 表示不取,如:%[^1]表示读取除'1'以外的所有字符 %[^/]表示除/以外的所有字符

(3),: 范围可以用“,”相连接 如%[1-9,a-z]表示同时取1-9数字和a-z小写字母

(4)原则:从第一个在指定范围内的数字开始读取,到第一个不在范围内的数字结束%s 可以看成%[] 的一个特例 %[^ ](注意^后面有一个空格!)

解析网址的例子如下所示:

1 const char *s = “www.baidu.com:1234”;

2 char protocol[32] = { 0 };

3 char host[128] = { 0 };

4 char port[8] = { 0 };

5 sscanf(s,“%[^:]://%[^:]:%[1-9]”,protocol,host,port);

6

7 printf(“protocol: %sn”,protocol);

8 printf(“host: %sn”,host);

9 printf(“port: %sn”,port);

10

4、snprintf函数

snprintf函数是sprintf函数的更加安全版本,考虑到字符串的字节数,防止了字符串溢出。函数形式为:int snprintf(char *restrict buf, size_t n, const char * restrict format, ...);。最多从源串中拷贝n-1个字符到目标串中,然后再在后面加一个0。所以如果目标串的大小为n 的话,将不会溢出。

5、测试程序

本次采用ip地址和整型之间的转换,mac地址转换作为测试程序,整个程序如下所示:

1 #include

2 #include

3

4 #define IP_STR_LEN 18

5 #define MAC_STR_LEN 18

6 #define MAC_BIT_LEN 6

7 #define LITTLE_ENDIAN 0

8 #define BIG_ENDIAN 1

9

10 typedef unsigned char uchar;

11 typedef unsigned int uint;

12

13 int big_little_endian

14 {

15 int data = 0x1;

16 if (*((char*)&data) == 0x1)

17 return LITTLE_ENDIAN;

18 return BIG_ENDIAN;

19 }

20

21 uint ipstr2int(const char * ipstr)

22 {

23 assert(ipstr);

24 uint a,b,c,d;

25 uint ip = 0;

26 sscanf(ipstr,“%u.%u.%u.%u”,&a,&b,&c,&d);

27 a = (a << 24) ;

28 b = (b << 16) ;

29 c = (c << 8) ;

30 d = (d << 0) ;

31 ip = a | b | c | d;

32 return ip;

33 }

34

35 char *int2ipstr(const uint ip, char *ipstr, const uint ip_str_len)

36 {

37 assert(ipstr);

38 if (big_little_endian() == LITTLE_ENDIAN)

39 sprintf(ipstr,“%u.%u.%u.%u”,

40 (uchar)*((char*)(&ip)+3),

41 (uchar)*((char*)(&ip)+2),

42 (uchar)*((char*)(&ip)+1),

43 (uchar)*((char*)(&ip)+0));

44 else

45 sprintf(ipstr,“%u.%u.%u.%u”,

46 (uchar)*((char*)(&ip)+0),

47 (uchar)*((char*)(&ip)+1),

48 (uchar)*((char*)(&ip)+2),

49 (uchar)*((char*)(&ip)+3));

50

51 return ipstr;

52 }

53

55 char *mac2str(const unsigned char *mac,char *mac_str,const uint mac_str_len)

56 {

57 assert(mac_str);

58 sprintf(mac_str,“%02X-%02X-%02X-%02X-%02X-%02X”,

59 mac[0],mac[1],mac[2],

60 mac[3],mac[4],mac[5]);

61 }

62

63 int main()

64 {

65 char ip_str[IP_STR_LEN] = {0};

66 char mac_str[MAC_STR_LEN] = {0};

67 unsigned char mac[MAC_BIT_LEN] = {0XEF,0XAD,0XF4,0X4F,0XAA,0X0F};

68 const char *ipstr = “10.0.3.193”;

69 unsigned int ip;

70 int2ipstr(167773121,ip_str,IP_STR_LEN);

篇2:C语言实验报告《函数》

C语言实验报告《函数》 -实习报告

学号:__________    姓名:__________    班级:__________    日期:__________指导教师:__________    成绩:__________实验四  函数一、 实验目的1、掌握函数定义、调用和声明的方法2、掌握实参和形参之间的'传递方式3、函数的嵌套调用二、 实验内容1、 写一个函数,将两个字符串连接。(习题8.6)2、 编写一个函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其他字符的个数,在主函数中输入字符串以及输出上述的结果。(习题8.9)3、 请将实验三中的实验内容三改正后,再改写成函数形式(排序部分)。物理实验报告 ・化学实验报告 ・生物实验报告 ・实验报告格式 ・实验报告模板三、 实验步骤与过程 四、程序调试记录

篇3:五、(C语言)函数

概述

在第一章中已经介绍过,C源程序是由函数组成的, 虽然在前面各章的程序中都只有一个主函数main, 但实用程序往往由多个函数组成。函数是C源程序的基本模块, 通过对函数模块的调用实现特定的功能。C语言中的函数相当于其它高级语言的子程序。 C语言不仅提供了极为丰富的库函数(如Turbo C,MS C 都提供了三百多个库函数),还允许用户建立自己定义的函数。用户可把自己的算法编成一个个相对独立的函数模块,然后用调用的方法来使用函数。

可以说C程序的全部工作都是由各式各样的函数完成的, 所以也把C语言称为函数式语言。 由于采用了函数模块式的结构, C语言易于实现结构化程序设计。使程序的层次结构清晰,便于程序的编写、阅读、调试。

在C语言中可从不同的角度对函数分类。

1. 从函数定义的角度看,函数可分为库函数和用户定义函数两种。

(1)库函数

由C系统提供,用户无须定义, 也不必在程序中作类型说明,只需在程序前包含有该函数原型的头文件即可在程序中直接调用。在前面各章的例题中反复用到printf 、 scanf 、 getchar 、putchar、gets、puts、strcat等函数均属此类。

(2)用户定义函数

由用户按需要写的函数。对于用户自定义函数, 不仅要在程序中定义函数本身, 而且在主调函数模块中还必须对该被调函数进行类型说明,然后才能使用。

2. C语言的函数兼有其它语言中的函数和过程两种功能,从这个角度看,又可把函数分为有返回值函数和无返回值函数两种。

(1)有返回值函数

此类函数被调用执行完后将向调用者返回一个执行结果, 称为函数返回值。如数学函数即属于此类函数。 由用户定义的这种要返回函数值的函数,必须在函数定义和函数说明中明确返回值的类型。

(2)无返回值函数

此类函数用于完成某项特定的处理任务, 执行完成后不向调用者返回函数值。这类函数类似于其它语言的过程。 由于函数无须返回值,用户在定义此类函数时可指定它的返回为“空类型”, 空类型的说明符为“void”。

3. 从主调函数和被调函数之间数据传送的角度看又可分为无参函数和有参函数两种。

(1)无参函数

函数定义、函数说明及函数调用中均不带参数。 主调函数和被调函数之间不进行参数传送。 此类函数通常用来完成一组指定的功能,可以返回或不返回函数值。

(2)有参函数

也称为带参函数。在函数定义及函数说明时都有参数, 称为形式参数(简称为形参)。在函数调用时也必须给出参数, 称为实际参数(简称为实参)。 进行函数调用时,主调函数将把实参的值传送给形参,供被调函数使用。

4. C语言提供了极为丰富的库函数, 这些库函数又可从功能角度作以下分类。

(1)字符类型分类函数

用于对字符按ASCII码分类:字母,数字,控制字符,分隔符,大小写字母等。

(2)转换函数

用于字符或字符串的转换;在字符量和各类数字量 (整型, 实型等)之间进行转换;在大、小写之间进行转换。

(3)目录路径函数

用于文件目录和路径操作。

(4)诊断函数

用于内部错误检测。

(5)图形函数

用于屏幕管理和各种图形功能,

(6)输入输出函数

用于完成输入输出功能。

(7)接口函数

用于与DOS,BIOS和硬件的接口。

(8)字符串函数

用于字符串操作和处理。

(9)内存管理函数

用于内存管理。

(10)数学函数

用于数学函数计算。

(11)日期和时间函数

用于日期,时间转换操作。

(12)进程控制函数

用于进程管理和控制。

(13)其它函数

用于其它各种功能。

以上各类函数不仅数量多,而且有的还需要硬件知识才会使用,因此要想全部掌握则需要一个较长的学习过程。 应首先掌握一些最基本、 最常用的函数,再逐步深入。由于篇幅关系,本书只介绍了很少一部分库函数, 其余部分读者可根据需要查阅有关手册。

还应该指出的是,在C语言中,所有的函数定义,包括主函数main在内,都是平行的。也就是说,在一个函数的函数体内, 不能再定义另一个函数, 即不能嵌套定义。但是函数之间允许相互调用,也允许嵌套调用。习惯上把调用者称为主调函数。 函数还可以自己调用自己,称为递归调用。main 函数是主函数,它可以调用其它函数,而不允许被其它函数调用。 因此,C程序的执行总是从main函数开始, 完成对其它函数的调用后再返回到main函数,最后由main函数结束整个程序。一个C源程序必须有,也只能有一个主函数main。

函数定义的一般形式

1.无参函数的一般形式

类型说明符 函数名()

{

类型说明

语句

}

其中类型说明符和函数名称为函数头。 类型说明符指明了本函数的类型,函数的类型实际上是函数返回值的类型。 该类型说明符与第二章介绍的各种说明符相同。 函数名是由用户定义的标识符,函数名后有一个空括号,其中无参数,但括号不可少。{} 中的内容称为函数体。在函数体中也有类型说明, 这是对函数体内部所用到的变量的类型说明。在很多情况下都不要求无参函数有返回值, 此时函数类型符可以写为void。

我们可以改为一个函数定义:

void Hello()

{

printf (“Hello,world n”);

}

这里,只把main改为Hello作为函数名,其余不变。Hello 函数是一个无参函数,当被其它函数调用时,输出Hello world字符串。

2.有参函数的一般形式

类型说明符 函数名(形式参数表)

型式参数类型说明

{

类型说明

语句

}

有参函数比无参函数多了两个内容,其一是形式参数表, 其二是形式参数类型说明。在形参表中给出的参数称为形式参数, 它们可以是各种类型的变量, 各参数之间用逗号间隔。在进行函数调用时,主调函数将赋予这些形式参数实际的值。 形参既然是变量,当然必须给以类型说明。例如,定义一个函数, 用于求两个数中的大数,可写为:

篇4:c语言函数天天见

总结在学习过程中遇到的c语言函数:

1、相关函数:fstat, lstat, chmod, chown, readlink, utime

头文件:#include#include

定义函数:int stat(const char * file_name, struct stat *buf);

函数说明:stat()用来将参数file_name 所指的文件状态, 复制到参数buf 所指的结构中,成功返回0,失败返回-1. stat结构体内详细信息不再赘述,可以参考其他博客资料。

使用方法:

struct stat sa;

if(stat(filename,&sa)<0)

{

return -1;

}

....

2、memset

总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c。

#include

using namespace std;

void main()

{

char s[20];

cout<<“s大小”<

3、rand(),RAND_MAX

rand()产生随机数的一个随机函数;

RAND_MAX是C中stdlib.h中宏定义的一个字符常量:

#define RAND_MAX Ox7FFF

其值最小为32767,最大为2147483647

通常在产生随机小数时可以使用RAND_MAX,

#include

#include

#include

using namespace std;

int main(void)

{

srand((unsigned int)time(NULL));

double a[10];

int i;

cout<

篇5:C语言调用Lua函数

记得上学时,初中英文课本中,上网叫做surfing the internet,中文叫网上冲浪,那个时期,人们经常称互联网为赛博空间。如今工作了,大量的零碎时间用于上微博,知乎,QQ,这些碎片化的阅读让人读起来轻松,也能获取些粗浅的信息。然而它们是消耗时间的黑洞,时间就这样一分一秒地飞逝,年末的时候,知乎会告诉你回答了多少问题,阅读了相当于一部《红楼梦》那么多的文字。只是当你静下来一想,这些浅阅读并没给你带来有深度,系统的知识。在你的时间线上,两条相邻信息往往是八竿子也打不着的。而且你还时不时去看看关注者有没有更新,期待让你眼前一亮的信息。结果往往是趁兴而去,败兴而回。屏幕上的信息永无止境地滚动着,是如此的热闹,仿佛每个人都在狂欢,而我的内心却如此的空虚与孤独。

在lua API中,调用一个函数的步骤很简单:1.压入你要调用的函数,使用lua_getglobal。2.压入调用参数。3.使用lua_pcall4.从栈中弹出结果。

举例说明,假设你有这么一个lua函数:function f (x, y)

return (x^2 * math.sin(y))/(1 - x)

end

那么,我们就可以定义个c函数来封装这个调用:/* call a function ‘f‘ defined in Lua */

double f (double x, double y) {

double z;lua_getglobal(L, “f”); lua_pushnumber(L, x); lua_pushnumber(L, y); /* do the call (2 arguments, 1 result) */if (lua_pcall(L, 2, 1, 0) != 0) error(L, “error running function ‘f‘: %s”,lua_tostring(L, -1));

if (!lua_isnumber(L, -1)) error(L, “function ‘f‘ must return a number”);z = lua_tonumber(L, -1);lua_pop(L, 1); return z;}

lua_pcall在压入结果的之前,会将函数,和参数弹出,如果返回多个结果,第一个最先压入,

如果lua_pcall运行出错,那么会返回个非0值。(完)

c语言函数知识点总结

LNK文件漏洞简要分析

进程间通信:信号量

Go语言对字符串进行SHA1哈希运算的方法

数据结构心得体会200字

高职《数据结构》课程的设计与实现

通用菜单生成程序.net

shell问答16:批量修改文件名后缀Unix系统

abiword的中文显示问题!_Unix系统

一个web蠕虫的简单实现

C语言sprintf与sscanf函数
《C语言sprintf与sscanf函数.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

【C语言sprintf与sscanf函数(共5篇)】相关文章:

IOS LPD远程缓冲区溢出漏洞2022-04-30

go语言异常panic和恢复recover用法实例2022-04-30

笔试题主观题2022-04-30

微电子EE笔试题2022-04-30

QQPlayer asx文件处理缓冲区溢出漏洞漏洞预警2022-12-20

附录的范文2022-08-01

go语言制作端口扫描器2022-06-17

go语言实现的memcache协议服务的方法2022-05-07

关于Linux下病毒的话题Windows系统2022-06-12

笔试题IP协议2022-09-10

点击下载本文文档