免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4798 | 回复: 5

[函数] c语言的sscanf() 提取括号里的字符问题 [复制链接]

论坛徽章:
0
发表于 2014-08-05 21:14 |显示全部楼层
char ip[32] = {0};
const char * p = "traceroute to www.baidu.com (115.239.210.27)";
sscanf(p, "traceroute to www.baidu.com (%s)", host, ip);
printf("ip=%s\n", ip);
=========================
打印结果为: ip=115.239.210.27)
我的问题是最后面的那个括号为什么也被提取出来了呢?

论坛徽章:
2
巳蛇
日期:2013-12-31 14:13:002015年亚洲杯之沙特阿拉伯
日期:2015-03-26 13:30:50
发表于 2014-08-05 21:42 |显示全部楼层
  1. sscanf("traceroute to www.baidu.com (115.239.210.27)", "%*[^(](%[^)]s", ip);
复制代码

论坛徽章:
0
发表于 2014-08-06 03:50 |显示全部楼层
真够奇怪的,括号貌似不应该出来~~

论坛徽章:
0
发表于 2014-08-06 08:14 |显示全部楼层
回复 2# lichmama


    果然能够工作,多谢,我去找一下关于这方面的资料。

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
发表于 2014-08-06 08:15 |显示全部楼层
%s当然包括了).
2楼正解~~
谁知道你的输入格式不是不
(2.3.4.1)))

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
发表于 2014-08-06 09:38 |显示全部楼层
本帖最后由 cobras 于 2014-08-06 09:53 编辑

给个代码,可以直接抽出全部有效ipv4的地址。

  1. /* getip4.c */

  2. #include <stdio.h>
  3. #include <ctype.h>
  4. #include <string.h>

  5. int get_decimal_number(const char *s, int *io_off, int lmt, int *o_value)
  6. {
  7.         int off;
  8.         int value;

  9.         off = *io_off;
  10.         if (off < lmt && isdigit(s[off])) {
  11.                 value = 0;
  12.                 do {
  13.                         value = value * 10 + s[off] - '0';
  14.                         ++off;
  15.                 }while (off < lmt && isdigit(s[off]));
  16.                 *o_value = value;
  17.                 *io_off = off;
  18.                 return 0;
  19.         }
  20.         return -1;
  21. }

  22. int get_ip4_address(const char *s, int *io_off, int lmt, unsigned char o_addr[4])
  23. {
  24.         int off;
  25.         unsigned char addr[4];
  26.         int value;
  27.         int i;

  28.         off = *io_off;
  29.         if (get_decimal_number(s, &off, lmt, &value) == 0 && value >= 0 && value < 256) {
  30.                 i = 0;
  31.                 for (;;) {
  32.                         addr[i++] = value;
  33.                         if (i >= 4) {
  34.                                 memcpy(o_addr, addr, sizeof(addr));
  35.                                 *io_off = off;
  36.                                 return 0;
  37.                         }
  38.                         if (s[off] != '.') {
  39.                                 break;
  40.                         }
  41.                         ++off;
  42.                         if (get_decimal_number(s, &off, lmt, &value) != 0 || value < 0 || value >= 256) {
  43.                                 break;
  44.                         }
  45.                 }
  46.         }
  47.         return -1;
  48. }

  49. int main(void)
  50. {
  51.         unsigned char addr[4];
  52.         const char *p = "traceroute to www.baidu.com (115.239.210.27)";
  53.         int off;
  54.         int lmt;

  55.         off = 0;
  56.         lmt = strlen(p);
  57.         while (off < lmt) {
  58.                 if (get_ip4_address(p, &off, lmt, addr) == 0) {
  59.                         printf("%d.%d.%d.%d\n", addr[0], addr[1], addr[2], addr[3]);
  60.                 }else {
  61.                         ++off;
  62.                 }
  63.         }
  64.         return 0;
  65. }
复制代码
修正版

  1. /* getip4.c */

  2. #include <stdio.h>
  3. #include <ctype.h>
  4. #include <string.h>

  5. int get_decimal_number(const char *s, int off, int lmt, int *o_off, int *o_value)
  6. {
  7.         int value;

  8.         if (off < lmt && isdigit(s[off])) {
  9.                 value = 0;
  10.                 do {
  11.                         value = value * 10 + s[off] - '0';
  12.                         ++off;
  13.                 }while (off < lmt && isdigit(s[off]));
  14.                 *o_value = value;
  15.                 *o_off = off;
  16.                 return 0;
  17.         }
  18.         return -1;
  19. }

  20. int get_ip4_address(const char *s, int off, int lmt, int *o_off, unsigned char o_addr[4])
  21. {
  22.         unsigned char addr[4];
  23.         int value;
  24.         int i;

  25.         if (get_decimal_number(s, off, lmt, &off, &value) == 0 && value >= 0 && value < 256) {
  26.                 i = 0;
  27.                 for (;;) {
  28.                         addr[i++] = value;
  29.                         if (i >= 4) {
  30.                                 memcpy(o_addr, addr, sizeof(addr));
  31.                                 *o_off = off;
  32.                                 return 0;
  33.                         }
  34.                         if (s[off] != '.') {
  35.                                 break;
  36.                         }
  37.                         ++off;
  38.                         if (get_decimal_number(s, off, lmt, &off, &value) != 0 || value < 0 || value >= 256) {
  39.                                 break;
  40.                         }
  41.                 }
  42.         }
  43.         *o_off = off;
  44.         return -1;
  45. }

  46. int main(void)
  47. {
  48.         unsigned char addr[4];
  49.         const char *p = "traceroute to www.baidu.com (115.239.210.27 192.168.1.188,192.3.8.0)";
  50.         int off, next;
  51.         int lmt;

  52.         off = 0;
  53.         lmt = strlen(p);
  54.         while (off < lmt) {
  55.                 if (get_ip4_address(p, off, lmt, &next, addr) == 0) {
  56.                         printf("%d.%d.%d.%d\n", addr[0], addr[1], addr[2], addr[3]);
  57.                         off = next;
  58.                 }else {
  59.                         if (next == off) {
  60.                                 ++off;
  61.                         }else {
  62.                                 off = next;
  63.                         }
  64.                 }
  65.         }
  66.         return 0;
  67. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,8.5折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时8.5折扣期:2019年9月30日前


----------------------------------------

大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP