c语言scandf用法,scannf的用法

自己的一个sscanf的用法

如何把char 数组中的2个字节的内存 "3200",算出10进制int值是多少

//char buffer[25] = {0};

//int iIndex = 0;

//buffer[iIndex++] = 0xff;

//buffer[iIndex++] = 0xff;

//buffer[iIndex++] = 0x32;

//buffer[iIndex++] = 0x00;

//buffer[iIndex++] = 0x20;

//for (int i = 5;i < 25;++i)

//{

//    buffer[i] = i;

//}

Way1:sprintf(buffer,"%x%x",unsignedCha32,unsignedCha00);//buffer is "3200"

int iValue = 0;sscanf(buffetr,"%x",&iValue);//iValue = 50;

Way2:

//unsigned short *pint = (unsigned short *)buffer;

//unsigned short  iNum  = pint[1];

//看看内存布局,windows是低字节在前,高字节在后

4 修改低高字节问题  如何全用联合体?sscanf and unsinged ushort *pint

char g_bufferRev[1024] = {0};

char g_bufferRead[1024] = {0};

char g_bufferFlag[4] = {0};

sprintf(g_bufferFlag,"%c%c",255,255);

int actualReadLen = 8;

sprintf(g_bufferRead,"%c%c%c%c%c%c%c%c",255,255,32,0,3,97,98,99);

strncat(g_bufferRev,g_bufferRead,actualReadLen);

strncat(g_bufferRev,g_bufferRead,actualReadLen);

这段代码对吗?

接收二进制 不要用strcat strstr

ff ff 02 26 fa 30 31 32 00 f3 ff ff 30 00 3c 1c 64 65

ff ff 00 32 fa 00 00 00 b0 f5 ff ff 30 00 3c 1e 00 00 00 00 00 00 00 00 00 00 00 00 00 00

原文出处:

点击打开链接

今天看到一个程序中sscanf() 的用法,比较有效,以前从来没有注意到,然后就查了一个它的帮助手册,其实以前也看过,只是大概浏览了一下,没有细细口味。 // gcc -o sscanTest sscanTest.c #include #include int main(int argc, char **argv) {  char sentence []="Rudolph is 12 years old";   char str [20];   char str2 [20];   char buf[128], buf2[128];   int i;   int a, b, c;   char sztime1[16] = "", sztime2[16] = "";     memset(buf, 0, 128);   sscanf (sentence,"%s %*s %d %s",str,&i, str2);   printf ("result100= %s -> %d -> %s\n",str, i, str2);     memset(buf, 0, 128);   sscanf("123456 ", "%3s", buf);   printf("result101= %s\n", buf);     memset(buf, 0, 128);   sscanf("123456 abcdedf", "%[^ ]", buf);   printf("result102= %s\n", buf);     memset(buf, 0, 128);   sscanf("123456abWWQcdedfBCDEF", "%*[1-9a-z]%s", buf);   printf("result103= %s\n", buf);   memset(buf, 0, 128);   sscanf("123456abWWQcdedfBCDEF", "%[1-9a-z]", buf);   printf("result1031= %s\n", buf);       memset(buf, 0, 128);   memset(buf2, 0, 128);   sscanf("bC123456abcdedfBCDEF", "%*[^A-Z]%c%*[0-9]%s", buf, buf2);   printf("result104= %s, %s\n", buf, buf2);       memset(buf, 0, 128);   memset(buf2, 0, 128);   //sscanf("bCDE123456abcdedfBCDEF", "%[a-z]%*[A-Z]%[^A-Z]", buf, buf2);   sscanf("bCDE123456abcdedfBCDEF", "%*[A-Za-z]%[^A-Z]", buf, buf2);   printf("result1041= %s , %s\n", buf, buf2);     memset(buf, 0, 128);   sscanf("iios/12DDabcWDFF@122", "%*[^/]/%[^@]", buf);   printf("result105= %s\n", buf);     memset(buf, 0, 128);   sscanf("hello,new world", "%*s%s", buf);   printf("result106= %s\n", buf);     // String of characters. This will read subsequent characters until a whitespace is found   // (whitespace characters are considered to be blank, newline and tab).   memset(buf, 0, 128);   sscanf("hello, new world", "%*s%s", buf);   printf("result1061= %s\n", buf);     sscanf("2006:03:18 - 2006:04:18", "%s - %s", sztime1, sztime2);   printf("result107= %s , %s\n", sztime1, sztime2);    memset(sztime1, 0, 16);  memset(sztime2, 0, 16);   sscanf("2006:03:18 - 2006:04:18", "%[0-9,:] - %[0-9,:]", sztime1, sztime2);   printf("result1071= %s , %s\n", sztime1, sztime2);   return 0; } 以上测试结果显示为: $ sscanTest.exe result100= Rudolph -> 12 -> years result101= 123 result102= 123456 result103= WWQcdedfBCDEF result1031= 123456ab result104= C, abcdedfBCDEF result1041= 123456abcdedf , result105= 12DDabc/WDFF result106= world result1061= new result107= 2006:03:18 , 2006:04:18 result1071= 2006:03:18 , 2006:04:18 参考网址对const char* s = iios/12DDWDFF@122; sscanf( s, "%*[^/]/%[^@]", buf );  的匹配说明,个人感觉说明不太明确(也许是个人的理解不到位吧) 以至我写了上面的练习来体会sscanf表达式的用法 以下是个人理解,有不清楚或错误的地方可指正: 此表达式:"%*[^/]/%[^@]" 它分为两部分,1。需要过滤的部分(也就是去掉部分),2。需要保留给返回值部分 如何确定表达式拆分成几部分,则由%来确定 %*[^/]/为过滤部分, %*[^/]只是过滤了"iios",再加上/,就过滤了"iios/"(参考(*)说明) %[^@]为返回值部分, 表示匹配到不是@字符为止的字符串,由于它是按char一个一个来匹配,一旦中止条件成立,就不再继续往下进行,也就是贪婪匹配结束 有关表达式可参考perl的,虽然sscanf的匹配模式没有正则表达式那么强大,但在一些场所还是很有效的!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值