sscanf源代码,c sscanf

http://www.itjxue.com  2023-01-05 00:29  来源:未知  点击次数: 

c++中sscanf函数与sprintf函数的用法

一.sscanf 读取格式化的字符串中的数据

sscanf和scanf类似,都是用于输入的,只是后者以屏幕为输入源,而前者以固定字符串为输入。

sscanf() 是从一个字符串中读进与指定格式相符的数据

二.sprintf与printf的用法很类似,只不过是前者输出到指定的目标,后者输出到屏幕。

sprintf()指的是字符串格式化命令,主要功能是把格式化的数据写入某个字符串中。

int scanf(const char format [,agument])

其中format可以是一个或多个

{%[ ][width][{h | l | l64 | L}]}type

{a|b|c}表示a、b、c中选一,[d]表示d是可有可无的。

所以,format形式可以有:

%s

%5s

%[a-z]5d

注意:

%*[width][{h | l | l64 | L}]}type表示过滤满足条件的字符串,不向目标中输出。

1、基本用法,取字符串

string source0 = "1234456";

char str[521];

sscanf(source0.c_str(),"%s",str);

sscanf(source0.c_str(),"%4s",str);

2、转换为整型数

string source0 = "123456";

int x;

sscanf(source0.c_str(),"%d",x);

sscanf(source0.c_str(),"%3d",x);

3、停止和范围

sscanf(source0,"%[^a]",str); //遇到“a”停止

sscanf(source0,"%[^c]",str); //遇到“c”停止

sscanf(source0,"%[1-9A-Z]",str); //只取范围1-9和A-Z的字符

sscanf(source0,"%[^b-z]",str); //遇到“b-z”停止

sscanf(source0,"%[^c-z]",str); //遇到“c-z”停止

4、格式转换

char source[512] = "2015:8:1";

int a,b,c;

sscanf(source,"%d:%d:%d",a,b,c);

注意:这个地方a、b、c必须加引用,否则会报错。

5、复杂情况

char source[512] = "fjkdsjf/123456@fjkdsjf";

char str[512];

sscanf(source,"%*[ /]/%[ @]",str);

结果为:123456

sprintf

sprintf与printf的用法很类似,只不过是前者输出到指定的目标,后者输出到屏幕。

int sprintf(char *buffer,const char *format,...)

举个例子:

结果:

1

buf = 1

buf = 00000001

2

buf = 2

buf = 00000002

sscanf()如何实现?

sscanf与scanf类似,都是用于输入的,只是后者以键盘(stdin)为输入源,前者以固定字符串为输入源。

举个例子给你看:

char* pQueryStr=getenv("QUERY_STRING");

char pName[256];

sscanf(pQueryStr,"name=%s",pName);

printf("Hello %s!\n",pName);

最后显示出来的就是:Hello tom!

C++ sscanf 解析管道符分隔的字符串,遇到为空的后面就无法解析了。代码如下:

我把原始字符串改了一下,添加了一个空格;

把匹配的格式改了一下,第五项解析空格

sscanf("02|04|5101|014|?|20170205?104504|03|5101|034||20170205?104504",

????????"%[^|]|%[^|]|%[^|]|%[^|]|%[?]|%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%[^|]",

????????szVehType,?szLaneType,?szNetId,?szSta,?szLane,?szTime,

????????szEnLaneType,?szEnNetID,?szEnSta,?szEnLane,?szEnTime);

解析的结果

szVehType:02

szLaneType:04

szNetId:5101

szSta:014

szLane:

szTime:20170205 104504

szEnLaneType:03

szEnNetID:5101

szEnSta:034

szEnLane:

szEnTime:

c语言编程,关于sscanf通过中文逗号截取字符串的问题

C语言sscanf函数的总结

在处理字符串的程序当中,经常会分析字符串,从一大长串的字符串截取我们需要的数据,这如果通过自己手写函数来分析,虽然可以,但当你知道sscanf的功能,那就自己写函数分析就显得多此一举。

这些函数的使用都很简单,总结一下,等下次使用一目了然。俗话说:好记性不如烂笔头,记录下来就是效率。

以下源代码是本人测试的源文件,附带讲解注释。

1./*****************************************************

2.** Name : sscanf.c

3.** Author : gzshun

4.** Version : 1.0

5.** Date : 2011-12

6.** Description : sscanf function

7.******************************************************/

8.#include stdio.h

9.#include stdlib.h

10.#include string.h

11.

12.static void sscanf_test(void);

13.

14.static void sscanf_test(void)

15.{

16. int ret;

17. char *string;

18. int digit;

19. char buf1[255];

20. char buf2[255];

21. char buf3[255];

22. char buf4[255];

23.

24. /*1.最简单的用法*/

25. string = "china beijing 123";

26. ret = sscanf(string, "%s %s %d", buf1, buf2, digit);

27. printf("1.string=%s\n", string);

28. printf("1.ret=%d, buf1=%s, buf2=%s, digit=%d\n\n", ret, buf1, buf2, digit);

29. /*

30. **执行结果:

31. **1.ret=2, buf1=china, buf2=beijing, digit=123

32. **可以看出,sscanf的返回值是读取的参数个数

33. */

34.

35. /*2.取指定长度的字符串*/

36. string = "123456789";

37. sscanf(string, "%5s", buf1);

38. printf("2.string=%s\n", string);

39. printf("2.buf1=%s\n\n", buf1);

40. /*

41. **执行结果:

42. **2.buf1=12345

43. */

44.

45. /*3.取到指定字符为止的字符串*/

46. string = "123/456";

47. sscanf(string, "%[^/]", buf1);

48. printf("3.string=%s\n", string);

49. printf("3.buf1=%s\n\n", buf1);

50. /*

51. **执行结果:

52. **3.buf1=123

53. */

54.

55. /*4.取到指定字符集为止的字符串*/

56. string = "123abcABC";

57. sscanf(string, "%[^A-Z]", buf1);

58. printf("4.string=%s\n", string);

59. printf("4.buf1=%s\n\n", buf1);

60. /*

61. **执行结果:

62. **4.buf1=123abc

63. */

64.

65. /*5.取仅包含指定字符集的字符串*/

66. string = "0123abcABC";

67. sscanf(string, "%[0-9]%[a-z]%[A-Z]", buf1, buf2, buf3);

68. printf("5.string=%s\n", string);

69. printf("5.buf1=%s, buf2=%s, buf3=%s\n\n", buf1, buf2, buf3);

70. /*

71. **执行结果:

72. **5.buf1=123

73. */

74.

75. /*6.获取指定字符中间的字符串*/

76. string = "iosAndroidwp7";

77. sscanf(string, "%*[^]%[^]", buf1);

78. printf("6.string=%s\n", string);

79. printf("6.buf1=%s\n\n", buf1);

80. /*

81. **执行结果:

82. **6.buf1=android

83. */

84.

85. /*7.指定要跳过的字符串*/

86. string = "iosVSandroid";

87. sscanf(string, "%[a-z]VS%[a-z]", buf1, buf2);

88. printf("7.string=%s\n", string);

89. printf("7.buf1=%s, buf2=%s\n\n", buf1, buf2);

90. /*

91. **执行结果:

92. **7.buf1=ios, buf2=android

93. */

94.

95. /*8.分割以某字符隔开的字符串*/

96. string = "android-iphone-wp7";

97. /*

98. **字符串取道'-'为止,后面还需要跟着分隔符'-',

99. **起到过滤作用,有点类似于第7点

100. */

101. sscanf(string, "%[^-]-%[^-]-%[^-]", buf1, buf2, buf3);

102. printf("8.string=%s\n", string);

103. printf("8.buf1=%s, buf2=%s, buf3=%s\n\n", buf1, buf2, buf3);

104. /*

105. **执行结果:

106. **8.buf1=android, buf2=iphone, buf3=wp7

107. */

108.

109. /*9.提取邮箱地址*/

110. string = "Email:beijing@sina.com.cn";

111. sscanf(string, "%[^:]:%[^@]@%[^.].%s", buf1, buf2, buf3, buf4);

112. printf("9.string=%s\n", string);

113. printf("9.buf1=%s, buf2=%s, buf3=%s, buf4=%s\n\n", buf1, buf2, buf3, buf4);

114. /*

115. **执行结果:

116. **9.buf1=Email, buf2=beijing, buf3=sina, buf4=com.cn

117. */

118.}

119.

120.int main(int argc, char **argv)

121.{

122. sscanf_test();

123.

124. return 0;

125.}

126.

127./*

128.**测试程序

129.**环境:

130.**Linux Ubuntu 2.6.32-24-generic-pae #39-Ubuntu SMP Wed Jul 28 07:39:26 UTC 2010 i686 GNU/Linux

131.**gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5)

132.**

133.gzshun@ubuntu:~/c/sscanf$ gcc sscanf.c -o sscanf

134.gzshun@ubuntu:~/c/sscanf$ ./sscanf

135.1.string=china beijing 123

136.1.ret=3, buf1=china, buf2=beijing, digit=123

137.

138.2.string=123456789

139.2.buf1=12345

140.

141.3.string=123/456

142.3.buf1=123

143.

144.4.string=123abcABC

145.4.buf1=123abc

146.

147.5.string=0123abcABC

148.5.buf1=0123, buf2=abc, buf3=ABC

149.

150.6.string=iosandroidwp7

151.6.buf1=android

152.

153.7.string=iosVSandroid

154.7.buf1=ios, buf2=android

155.

156.8.string=android-iphone-wp7

157.8.buf1=android, buf2=iphone, buf3=wp7

158.

159.9.string=Email:beijing@sina.com.cn

160.9.buf1=Email, buf2=beijing, buf3=sina, buf4=com.cn

161.*/

本篇文章来源于 Linux公社网站() 原文链接:

C语言 sscanf() 用法

C语言函数sscanf()的用法sscanf() - 从一个字符串中读进与指定格式相符的数据.函数原型:int sscanf( string str, string fmt, mixed var1, mixed var2 ... );int scanf( const char *format [,argument]... );说明:sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。其中的format可以是一个或多个 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '\t' | '\n' | 非%符号}注:1、 * 亦可用于格式中, (即 %*d 和 %*s) 加了星号 (*) 表示跳过此数据不读入. (也就是不把此数据读入参数中)2、{a|b|c}表示a,b,c中选一,[d],表示可以有d也可以没有d。3、width表示读取宽度。4、{h | l | I64 | L}:参数的size,通常h表示单字节size,I表示2字节 size,L表示4字节size(double例外),l64表示8字节size。5、type :这就很多了,就是%s,%d之类。6、特别的:%*[width] [{h | l | I64 | L}]type 表示满足该条件的被过滤掉,不会向目标参数中写入值支持集合操作:%[a-z] 表示匹配a到z中任意字符,贪婪性(尽可能多的匹配)%[aB'] 匹配a、B、'中一员,贪婪性%[^a] 匹配非a的任意字符,贪婪性注意:在读入的字符串是空字符串时,sscanf函数并不改变待读入到的字符串的值。

(责任编辑:IT教学网)

更多

推荐其他营销文章