中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > C/C++
请教一个sscanf的问题
作者:未知 时间:2005-09-13 19:23 出处:ChinaUnix.net 责编:chinaitpower
              摘要:请教一个sscanf的问题

在sco下我遇到这样一个问题:
     char s[30],ss[30];
      sprintf(s,"     hello            ");
      sscanf(s,"%s",ss);
      sscanf(s,"%s",s);
 则strlen(s)=5,strlen(ss)=5;
      sprintf(s," ");
      sscanf(s,"%s",ss);
      sscanf(s,"%s",s);
      则strlen(s)=1,strlen(ss)=0;
不知这是怎么回事?sscanf能去掉字符串前后的空格吧?

 unicorns 回复于:2003-07-10 15:03:20
sscanf中如果参数是%s的话,遇到空格就认为是字符串结束了。   
第一个例子hello前后都有空格?
结果是你写的那样吗?

 howardlea 回复于:2003-07-10 15:04:48
后边那个sscanf(s,"%s",s)以后,strlen(s)为什么不是0?

 unicorns 回复于:2003-07-10 15:06:41
[quote:9ced9d0282="howardlea"]后边那个sscanf(s,"%s",s)以后,strlen(s)为什么不是0?[/quote:9ced9d0282]     
因为s中本来就有一个空格。
sscanf(s, "%s", s)
碰到第一个字符发现是空格就返回了
s中的内容没有被改变当然还是1了

 howardlea 回复于:2003-07-10 15:09:21
不好意思,还是不大明白,为什么sscanf(s,"%s",ss)后,strlen(ss)=0?sscanf(s,"%s",s),sscanf(s,"%s",ss)结果为什么不一样?

 howardlea 回复于:2003-07-10 15:12:12
[quote:ec6dfb3fd0="unicorns"]    
因为s中本来就有一个空格。
sscanf(s, "%s", s)
碰到第一个字符发现是空格就返回了
s中的内容没有被改变当然还是1了[/quote:ec6dfb3fd0]     
如果s中放6个空格
那么,sscanf(s,"%s",s)后,strlen(s)=6而不是1,为什么?

 howardlea 回复于:2003-07-10 15:14:26
[quote:b1c385f684="unicorns"]sscanf中如果参数是%s的话,遇到空格就认为是字符串结束了。   
第一个例子hello前后都有空格?
结果是你写的那样吗?[/quote:b1c385f684]  
是这样的

 unicorns 回复于:2003-07-10 15:16:44
因为s[0]是空格,所以sscanf什么都不做就返回了
所以s和ss都还保持初始状态不变。
初始状态strlen(s)就是1,strlen(ss)就是0吧

第一个例子我不知道怎么解释,按我目前的理解 不应该是这样啊

 fieryfox 回复于:2003-07-10 15:32:22
不是解释得挺清楚吗,为什么又说不知怎么解释?
 sprintf(s," hello ");
sscanf(s,"%s",ss);  // s不变,ss为"hello"
sscanf(s,"%s",s);   // s也成了"hello"

 howardlea 回复于:2003-07-10 15:43:08
unicorns说sscanf中如果参数是%s的话,遇到空格就认为是字符串结束了。因为s[0]是空格,所以sscanf什么都不做就返回了 
所以s和ss都还保持初始状态不变。
          这样的话,s应该是" hello ",ss应该是""。

 fieryfox 回复于:2003-07-10 15:49:59
理解错了。“遇到空格就认为是字符串结束了”是说尾巴,不是说头。头部空格不会认的。只有"%c"才会返回空格,所以你如果想读入一个非空字符必须用:
char s[2];
scanf("%1s", s);

 howardlea 回复于:2003-07-10 16:06:34
非常感谢两位的解释。下面是我的理解,不知对不对:
1、一般来说,sscanf(s,"%s",s)的作用应该是去掉s字符串前后的空格吧?
2、如果s=" hello world ",那么sscanf(s,"%s",ss)后,ss="hello",对吧?
3、如果要取一个字符串的前几位,用sscanf(s,"%2c",ss)(取s的前两位放到ss中)对吗?我试过有时对,有时会出现乱码,不知什么原因。
4、如果s字符串中全是空格,那么sscanf(s,"%s",ss),sscanf(s,"%s",s)后,ss=""(空字符串),s保持多个空格不变,对吧?

 fieryfox 回复于:2003-07-10 16:25:18
最好不要用sscanf(s,"%s",s)这样的方法,如果库函数实现是先清了s再拷贝,那就什么都没了。

另外2c应该是对的。

 unicorns 回复于:2003-07-10 16:27:02
我刚才试了
sscanf(" hello ", "%s", ss)
确实strlen(ss)是5
那我的原来的理解是错误的

btw,楼上的,sscanf(s, "%2c", ss)应该写成
sscanf(s, "%2s", ss)才对

 fieryfox 回复于:2003-07-10 16:30:51
%2s读不进来空格。看我前边对%c的说明。

 howardlea 回复于:2003-07-10 16:36:21
[quote:370af76706="fieryfox"]最好不要用sscanf(s,"%s",s)这样的方法,如果库函数实现是先清了s再拷贝,那就什么都没了。

[/quote:370af76706]     
那要去掉字符串前后的空格该怎么处理?按位判断吗?
我之所以用到这个功能是因为在用esql/c进行数据库操作时,从数据库中读取的字符串有可能有多余的空格.............
另外,是不是在每个字符串最后要手工加一个'\0'?每个字符串用之前都要memset吗?

 unicorns 回复于:2003-07-10 16:39:07
关于去空格的问题
论坛上讨论过的
好象有人贴过一些源码上来

 fieryfox 回复于:2003-07-10 16:44:33
呵呵,我只是说这样有危险,因为你依赖了库的内部实现。不过现在的库大概都不会有问题,你可以这样用。如果有问题再说。
去掉头尾的空格一般是逐个字节处理。
字符串根据生成方式和使用方式的不同,最后一个字符是否要是'\0'和是否要手工增加都是不一定的,与上下文相关。这也是C里经常出错的一个地方。
每个都memset不必要。空串可以用s[0]='\0'。

 howardlea 回复于:2003-07-10 16:48:13
又发现一个有趣的问题,sprintf与sscanf的区别
s=" hello "
sprintf(s,"%s",s)----------------s=" hello "
sscanf(s,"%s",s)----------------s="hello"
sscanf(s,"%2s",ss)------------ss="he"
sscanf(s,"%2c",ss)------------ss=" h"
sprintf(ss,"%2s",s)------------ss=" hello "
sprintf(ss,"%2c",s)-------------ss=" ?"

 howardlea 回复于:2003-07-10 16:52:08
再次感谢两位的指点,使我受益菲浅

 fieryfox 回复于:2003-07-10 16:53:01
sprintf(ss,"%2c",s)-------------ss=" ?"
不能这么用。s不是字符。

 howardlea 回复于:2003-07-10 16:59:55
[quote:a746201b22="fieryfox"]sprintf(ss,"%2c",s)-------------ss=" ?"
不能这么用。s不是字符。[/quote:a746201b22]     
那为什么scanf可以?

 fieryfox 回复于:2003-07-10 17:06:03
两个2含义不一样。scanf中2c表示读入两个字符到缓冲区s,只要s足够大就没问题。sprintf中2c表示输出1个字符占两个字符的宽度,期望的变量是int。你的举例里相当于把s作为int解释,其值解释为字符是不可打印字符,所以输出了" ?"。

 howardlea 回复于:2003-07-10 17:16:18
上面写错了,我的意思是sscanf为什么可以?

 fieryfox 回复于:2003-07-10 17:18:08
scanf和sscanf没区别。

 howardlea 回复于:2003-07-10 17:20:19
我明白了,谢谢!!!!!!!!!!

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有