| 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
|
我明白了,谢谢!!!!!!!!!!
|