免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2935 | 回复: 8
打印 上一主题 下一主题

奇怪scanf [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-06-17 14:51 |只看该作者 |倒序浏览
void main()
{
  char s[] = "abc&:111&:20081018&xx";

  char s1[100];
  char s2[100];
  char s3[100];
  char s4[100];

  memset( s1, 0x00, sizeof(s1) );
  memset( s2, 0x00, sizeof(s1) );
  memset( s3, 0x00, sizeof(s1) );
  memset( s4, 0x00, sizeof(s1) );

  sscanf( s, "%[^&:]&:%[^&:]&:%[^&:]&:%[^&:]", s1, s2, s3, s4 );

  printf( "\n[%s]", s );
  printf( "\n[%s]", s1 );
  printf( "\n[%s]", s2 );
  printf( "\n[%s]", s3 );
  printf( "\n[%s]", s4 );
  printf( "\n" );

}



结果是:

[abc&:111&:20081018&xx]
[abc]
[111]
[20081018]
[xxx]


void main()
{
  char s[] = "abc&:111&:20081018&:";

  char s1[100];
  char s2[100];
  char s3[100];
  char s4[100];

  memset( s1, 0x00, sizeof(s1) );
  memset( s2, 0x00, sizeof(s1) );
  memset( s3, 0x00, sizeof(s1) );
  memset( s4, 0x00, sizeof(s1) );

  sscanf( s, "%[^&:]&:%[^&:]&:%[^&:]&:%[^&:]", s1, s2, s3, s4 );

  printf( "\n[%s]", s );
  printf( "\n[%s]", s1 );
  printf( "\n[%s]", s2 );
  printf( "\n[%s]", s3 );
  printf( "\n[%s]", s4 );
  printf( "\n" );

}


结果是:

[abc&:111&:20081018&:]
[abc]
[111]
[20081018]
[]


void main()
{
  char s[] = "abc&:&:20081018&:";

  char s1[100];
  char s2[100];
  char s3[100];
  char s4[100];

  memset( s1, 0x00, sizeof(s1) );
  memset( s2, 0x00, sizeof(s1) );
  memset( s3, 0x00, sizeof(s1) );
  memset( s4, 0x00, sizeof(s1) );

  sscanf( s, "%[^&:]&:%[^&:]&:%[^&:]&:%[^&:]", s1, s2, s3, s4 );

  printf( "\n[%s]", s );
  printf( "\n[%s]", s1 );
  printf( "\n[%s]", s2 );
  printf( "\n[%s]", s3 );
  printf( "\n[%s]", s4 );
  printf( "\n" );

}


结果居然是:


[abc&:&:20081018&:]
[abc]
[]
[]
[]


求解!!!!!

我期望的结果是:


[abc&:&:20081018&:]
[abc]
[]
[20081018]
[]

应该怎么做???????????

论坛徽章:
0
2 [报告]
发表于 2011-06-17 14:52 |只看该作者
void main()
{
  char s[] = "abc&:111&:20081018&:ffff";

  char s1[100];
  char s2[100];
  char s3[100];
  char s4[100];

  memset( s1, 0x00, sizeof(s1) );
  memset( s2, 0x00, sizeof(s1) );
  memset( s3, 0x00, sizeof(s1) );
  memset( s4, 0x00, sizeof(s1) );

  sscanf( s, "%[^&:]&:%[^&:]&:%[^&:]&:%[^&:]", s1, s2, s3, s4 );

  printf( "\n[%s]", s );
  printf( "\n[%s]", s1 );
  printf( "\n[%s]", s2 );
  printf( "\n[%s]", s3 );
  printf( "\n[%s]", s4 );
  printf( "\n" );

}



结果是:

[abc&:111&:20081018&:ffff]
[abc]
[111]
[20081018]
[ffff]


void main()
{
  char s[] = "abc&:111&:20081018&:";

  char s1[100];
  char s2[100];
  char s3[100];
  char s4[100];

  memset( s1, 0x00, sizeof(s1) );
  memset( s2, 0x00, sizeof(s1) );
  memset( s3, 0x00, sizeof(s1) );
  memset( s4, 0x00, sizeof(s1) );

  sscanf( s, "%[^&:]&:%[^&:]&:%[^&:]&:%[^&:]", s1, s2, s3, s4 );

  printf( "\n[%s]", s );
  printf( "\n[%s]", s1 );
  printf( "\n[%s]", s2 );
  printf( "\n[%s]", s3 );
  printf( "\n[%s]", s4 );
  printf( "\n" );

}


结果是:

[abc&:111&:20081018&:]
[abc]
[111]
[20081018]
[]


void main()
{
  char s[] = "abc&:&:20081018&:";

  char s1[100];
  char s2[100];
  char s3[100];
  char s4[100];

  memset( s1, 0x00, sizeof(s1) );
  memset( s2, 0x00, sizeof(s1) );
  memset( s3, 0x00, sizeof(s1) );
  memset( s4, 0x00, sizeof(s1) );

  sscanf( s, "%[^&:]&:%[^&:]&:%[^&:]&:%[^&:]", s1, s2, s3, s4 );

  printf( "\n[%s]", s );
  printf( "\n[%s]", s1 );
  printf( "\n[%s]", s2 );
  printf( "\n[%s]", s3 );
  printf( "\n[%s]", s4 );
  printf( "\n" );

}


结果居然是:


[abc&:&:20081018&:]
[abc]
[]
[]
[]


求解!!!!!

我期望的结果是:


[abc&:&:20081018&:]
[abc]
[]
[20081018]
[]

应该怎么做???????????

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
3 [报告]
发表于 2011-06-17 15:38 |只看该作者
回复 1# xiaobenniao514


是不是只想要s1和s3的值?那样的话可以不用s2和s4。从上到下,依次改为:
  1.   sscanf( s, "%[^&:]&:%*[^&:]&:%[^&:]&:%*[^&:]", s1, s3);

  2.   sscanf( s, "%[^&:]&:%*[^&:]&:%[^&:]&:%*[^&:]", s1, s3);

  3.   sscanf( s, "%[^&:]&:%*[^0-9]%[^&:]&:%[]", s1, s3 );
复制代码

论坛徽章:
0
4 [报告]
发表于 2011-06-17 15:44 |只看该作者
回复 3# cokeboL


    不是只想取1 3的值,是想有值就输出,没值也输出~~

    现在是一个没值把后面有值的部分给搞没了~~~~~

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:56:11
5 [报告]
发表于 2011-06-17 15:56 |只看该作者
標題不對。

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
6 [报告]
发表于 2011-06-17 17:15 |只看该作者
回复 5# nizvoo


    帮主,这个有解没?

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
7 [报告]
发表于 2011-06-17 17:17 |只看该作者
楼主可不可以考虑在写日志还是干嘛给s赋值的时候如果某段为空加个空格之类的字符?

论坛徽章:
0
8 [报告]
发表于 2011-06-17 17:24 |只看该作者
回复 7# cokeboL


    有道理,可以放一个预留字符串,

    不过那是人家的接口,他们不会为我而放的。

   其实 用strstr或者strtok都可以解决,但是要一个域一个域地拿出来比较麻烦~~~

论坛徽章:
0
9 [报告]
发表于 2011-06-19 21:34 |只看该作者
你要判断sscanf 的返回值, sscanf 只取到一个值,返回了1。

第二个值取不到,就退出了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP