C语言中的函数sscanf()用法
定义
int sscanf( const char *buffer, const char *format, [ argument ] ... );
常规用法:
//16进制字符串转unsigned charconst 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就是按空格一段一段读取的
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结束;
看代码
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开始了。
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的字符开始。