打印

VC6Bug!

[复制链接]
2758|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liub_2014|  楼主 | 2013-3-14 22:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
VC6中程序如下:
#include<stdio.h>
#include<string.h>
#include<wchar.h>

int main(void)
{
    int iLength = 0;
    wchar_t *pw = "hello!";
    iLength = strlen(pw);
    printf(" %d ", pw, iLength);
}

  iLength 的结果应该为1的,因为strlen的参数为char而不是wchar_t。
  执行输出结果怎么输出6呢?
  这是VC6的Bug吗?

相关帖子

沙发
liub_2014|  楼主 | 2013-3-14 22:47 | 只看该作者

RE: VC6Bug!

不好意思pw是做字符串输出的,忘去掉了,printf语句为printf("%d", iLength);

使用特权

评论回复
板凳
liub_2014|  楼主 | 2013-3-14 22:48 | 只看该作者
请各位大神们看看

使用特权

评论回复
地板
huangxz| | 2013-3-14 23:02 | 只看该作者
wchar_t *pw = "hello!";
    iLength = strlen(pw);
iLength 是"hello!"的长度

strlen自动使用宽字符版本

使用特权

评论回复
5
airwill| | 2013-3-15 09:28 | 只看该作者
编程手册上说:
Get the length of a string.

size_t strlen( const char *string );
size_t wcslen( const wchar_t *string );

会不会 C++ 智能的参数识别, 自动替换成下面的函数了

使用特权

评论回复
6
原野之狼| | 2013-3-15 10:18 | 只看该作者
不要让这种类型不一致的情况出现

使用特权

评论回复
7
icecut| | 2013-3-15 10:58 | 只看该作者
huangxz 发表于 2013-3-14 23:02
wchar_t *pw = "hello!";
    iLength = strlen(pw);
iLength 是"hello!"的长度

非常正确

使用特权

评论回复
8
liub_2014|  楼主 | 2013-3-15 20:10 | 只看该作者
但strlen的参数是char 而不是wchar_t,在windows中,‘h’的高字节是0,就是字符串结束标志啊,所以strlen返回的是1而不是6

使用特权

评论回复
9
liub_2014|  楼主 | 2013-3-15 20:11 | 只看该作者
也就是strlen检测到字符‘h’后面就是0字符串结束标志

使用特权

评论回复
10
liub_2014|  楼主 | 2013-3-15 20:12 | 只看该作者
huangxz 发表于 2013-3-14 23:02
wchar_t *pw = "hello!";
    iLength = strlen(pw);
iLength 是"hello!"的长度

哈哈,你这说的也太牵强了吧,

使用特权

评论回复
11
liub_2014|  楼主 | 2013-3-15 20:14 | 只看该作者
airwill 发表于 2013-3-15 09:28
编程手册上说:
Get the length of a string.

那是不可能的,strlen在内存中是按一个字节处理的,也就是一个字符

使用特权

评论回复
12
liub_2014|  楼主 | 2013-3-15 20:21 | 只看该作者
都来看看吧

使用特权

评论回复
13
dqyubsh| | 2013-3-15 22:15 | 只看该作者
本帖最后由 dqyubsh 于 2013-3-15 22:16 编辑
liub_2014 发表于 2013-3-15 20:10
但strlen的参数是char 而不是wchar_t,在windows中,‘h’的高字节是0,就是字符串结束标志啊,所以strlen返 ...

大哥你都学杂了,'h'高字节是0,你听哪个体育老师教的?是不是其它字母高字节都是0,那结果都等于1啊?

话说你要是个电工,干脆别操练VC/MFC折磨自己了。VC/MFC没有两年功力,你就是门外汉,半瓶醋,让你写个多线程,你立即就能现原形。

使用特权

评论回复
14
mxh0506| | 2013-3-15 23:59 | 只看该作者
楼主可能还没有搞明白如何控制使用宽字符。上面那段程序要用宽字符的话应该这样写:
wchar_t *pw = L"hello!";
不过,这里说它是VC6的BUG也不为过。VC6毕竟是上世纪90年代的东西,不是很完善。这里的关键问题是类型限制不严,允许把ASCII字串赋给宽字符指针类型,导致了混乱。你程序里的那个pw指针指向的数据内容,实际上并不是宽字符,因此高字节不会是0。这种问题在新版的VC++中已经不存在了。像 wchar_t *pw = "hello!"这样的赋值语句,在新版VC++中会报告类型错误。

使用特权

评论回复
评论
lxyppc 2013-3-16 08:21 回复TA
楼主,这就是你要的答案 
评分
参与人数 1威望 +5 收起 理由
dong_abc + 5 赞一个!
15
ipman| | 2013-3-16 11:44 | 只看该作者
wchar_t *pw = "hello!" 会警告!

使用特权

评论回复
16
liub_2014|  楼主 | 2013-3-16 18:29 | 只看该作者
dqyubsh 发表于 2013-3-15 22:15
大哥你都学杂了,'h'高字节是0,你听哪个体育老师教的?是不是其它字母高字节都是0,那结果都等于1啊?

...

我是说,'h'按宽字符处理的话,那么'h'在内存中是占两个字节的,在windows中,第一个字节是存储在前面的,那么后面一个字节不就是'0000H'了吗?这不是null字符吗?

使用特权

评论回复
17
liub_2014|  楼主 | 2013-3-16 18:30 | 只看该作者
ipman 发表于 2013-3-16 11:44
wchar_t *pw = "hello!" 会警告!

没有警告发生啊!

使用特权

评论回复
评论
dong_abc 2013-3-16 18:53 回复TA
新版本会警告。 
18
liub_2014|  楼主 | 2013-3-16 18:35 | 只看该作者
mxh0506 发表于 2013-3-15 23:59
楼主可能还没有搞明白如何控制使用宽字符。上面那段程序要用宽字符的话应该这样写:
wchar_t *pw = L"hello ...

谢谢达人,在后面,当我加上L后就好了!不够这样真的很别扭,不过用VC6,L不能少的,不然怎么会在windows程序中使用TEXT宏呢!

使用特权

评论回复
19
liub_2014|  楼主 | 2013-3-16 18:37 | 只看该作者
就是要在"hello"前加上'L'标示

使用特权

评论回复
20
liub_2014|  楼主 | 2013-3-16 19:14 | 只看该作者
谢谢了,以后大家多讨论啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

178

帖子

0

粉丝