C语言中的函数sscanf()用法

定义

cpp 复制代码
int sscanf(     const char *buffer,     const char *format, [ argument ] ...   ); 

常规用法:

cpp 复制代码
        //16进制字符串转unsigned char
		const char* hex = "1e08ab7f38974cef";
		unsigned char shex[16];
		for (int i = 0; i < 16; i += 2)
			sscanf(hex + i, "%2x", &shex[i / 2]);
		for (int i = 0; i < 8; i++)
			printf("%02x", shex[i]);
		printf("\n");

进行%s、%d、%x等转换时,若不指定长度,它最多读到空格,它会以空格隔开;

即使指定更大的长度,它也会以空格为限。

sscanf就是按空格一段一段读取的

cpp 复制代码
		char buf1[32], buf2[32];
        int n=0;
		sscanf("abc 123", "%s %s", buf1, buf2);
		printf("%s\n%s\n", buf1, buf2);
        //以上,原始字符串有空格,%s%s会把两个字符串读正确,buf1,buf2
        //两个%s之间的空格可有可无

		sscanf("abc 123", "%s %d", buf1, n);
		printf("%s\n%d\n", buf1, n);
        //

		sscanf("abc 123", "%5s", buf1);
		printf("%s\n", buf1);
        //即使你要读了5个字符,但有空格、只能给你abc

%XXX用法

你只要记住一点,不管是%abc、%1-9a-z、还是%\^A-Z,都是遇到哪些字符时就结束。

%abc 是遇到不是abc结束;

%1-9a-z 是遇到不是1-9a-z结束;

%\^A-Z 是遇到A-Z结束;

看代码

cpp 复制代码
		sscanf("123456abcdAedfBCDEF", "%[1-9a-z]", buf);
		printf("%s\n", buf);
		//结果为:123456abcd,而不是123456abcdedf,她遇到A就结束了
		 
		 
		sscanf("112323456abcdedfBCDEF11111111111", "%[123]", buf);
		printf("%s\n", buf);
        //结果为112323,而不是11232311111111111,遇到4就结束
		
		//取遇到大写字母为止的字符串。
		sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf);
        printf("%s\n",buf);

%\^XXX遇到那些字符时就把XXX之前的字符串赋给了对应变量;

此时还没完,后面的仍然可以继续读取赋值。那后面就从XXX开始了。

cpp 复制代码
    char string[] = "192.168.0.10/24, 192.168.1.254";
	char address[16] = { 0 };
	char mask[16] = { 0 };
	char gateway[16] = { 0 };
	sscanf(string, "%[^/]/%[^,],%s", address, mask, gateway);
//%[^/]读到/结束,则把192.168.0.10赋给了address
//后面从/开始读了,
//格式/, %[^,]读到,结束,则把24赋给了mask
//再从,开始, 格式, , %s读到最后。。。

	printf("address=%s\n", address);
	printf("mask=%s\n", mask);
	printf("gateway=%s\n", gateway);

%XXX可以跟别的控制符实现更强功能,比如%*abc表示舍去开始连续是abc的字符、或者说从不是abc的字符开始。

相关推荐
hsg7737 分钟前
简述:Rust、GeoRust、自主研发GIS平台
开发语言·后端·rust
承渊政道1 小时前
飞算Java炫技赛:Java×Unity数字孪生园区平台的从零落地记录
java·开发语言·unity·技术分享·vibe coding·飞算javaai·飞算java ai炫技赛
wdfk_prog7 小时前
嵌入式面试真题第 10 题:高优化等级下共享状态可见性、内存模型与系统级同步设计
java·linux·开发语言·面试·职场和发展·架构·c
wdfk_prog9 小时前
嵌入式面试真题第 11 题:RTOS 优先级翻转与实时任务阻塞的通用治理
c语言·缓存·面试·职场和发展·架构
许彰午10 小时前
95_Python内存管理与垃圾回收
开发语言·python
多加点辣也没关系10 小时前
JavaScript|第13章:原始类型的方法
开发语言·javascript·ecmascript
এ慕ོ冬℘゜11 小时前
深入理解 JavaScript 事件体系:Window、鼠标与键盘事件详解
开发语言·javascript·okhttp
chouchuang12 小时前
day-030-综合练习-笔记管理器
开发语言·笔记·python
云空13 小时前
《Three.js 3D实例大全》
开发语言·javascript·3d·three.js
techdashen13 小时前
Go 1.26 新增 `bytes.Buffer.Peek`:只看数据,不移动读取位置
开发语言·后端·golang