免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: leiyu
打印 上一主题 下一主题

不理解的strlen [复制链接]

论坛徽章:
0
21 [报告]
发表于 2006-03-21 20:39 |只看该作者
原帖由 p4apple 于 2006-3-21 20:11 发表
strncpy 结尾没有‘/0‘ 吧?


那要看怎么用strncpy了
例如


  1. char *a = "hello";
  2. char buf[128];

  3. strncpy(buf, a, strlen(a)+1);

复制代码


就有 '\0'了
呵呵!

论坛徽章:
0
22 [报告]
发表于 2006-03-21 20:47 |只看该作者
举个简单的例子:
我经常见到有人写这样的句子:

char *str;
str = (char *)malloc( SIZE );
memset( str, 0x00, SIZE );
strcpy( str, "hello, world" );

这里的 memset 很显然就是不必要的,而且,还容易误导人。



搞不懂,怎么会误导人?怎么误导了?
好像很高深的样子啊。

论坛徽章:
0
23 [报告]
发表于 2006-03-21 21:14 |只看该作者
原帖由 flw 于 2006-3-21 11:34 发表

那也得看它是当作左值还是右值,不能一概而论。


右值
有这样的称呼吗?
杜撰的吧。

左值:引用某个对象的表达式。原本是想说“某个可以放在赋值左边的东西”。
引自《C++程序设计语言》 4.9.6节。

论坛徽章:
0
24 [报告]
发表于 2006-03-21 21:26 |只看该作者
原帖由 高峰 于 2006-3-21 20:47 发表
举个简单的例子:
我经常见到有人写这样的句子:

char *str;
str = (char *)malloc( SIZE );
memset( str, 0x00, SIZE );
strcpy( str, "hello, world" );

这里的 memset 很显然就是不必要的,而且,还容易误导人。

搞不懂,怎么会误导人?怎么误导了?
好像很高深的样子啊。


memset( str, 0x00, SIZE ); 是对str所指单元内容清零。
而strcpy会把"hello, world",连同一个'\0'字符复制给str所指的对象。
如果只想输出"hello, world",用memset( str, 0x00, SIZE );似乎多余。

没什么高深的东西。
只是个人的习惯和书写代码风格的不同而已。
就象


  1. if () {
  2.     ...
  3. } else {
  4.     ...
  5. }
复制代码


还是

  1. if ()
  2. {
  3.     ...
  4. }
  5. else
  6. {
  7.     ...
  8. }
复制代码


一样。

论坛徽章:
0
25 [报告]
发表于 2006-03-21 21:47 |只看该作者
变量a,
左值表示从写数据到a的内存
右值表示从a得内存把数据读出

论坛徽章:
0
26 [报告]
发表于 2006-03-21 21:49 |只看该作者
原帖由 is01zyf 于 2006-3-21 21:47 发表
变量a,
左值表示从写数据到a的内存
右值表示从a得内存把数据读出


有点意思!
但似乎是个动作,不是值。
出处?

[ 本帖最后由 westgarden 于 2006-3-21 21:52 编辑 ]

论坛徽章:
0
27 [报告]
发表于 2006-03-22 08:56 |只看该作者
原帖由 westgarden 于 2006-3-21 21:14 发表


右值
有这样的称呼吗?
杜撰的吧。

左值:引用某个对象的表达式。原本是想说“某个可以放在赋值左边的东西”。
引自《C++程序设计语言》 4.9.6节。

以下出自 Expert C programming, Chapter 4
The symbol appearing on the left of an assignment is sometimes called an l-value (for "left-hand-side" or "locator" value), while a symbol on the right of an assignment is sometimes called an r-value (for "right-hand-side" ) . The compiler allocates an address (or l-value) to each variable. This address is known at compiletime, and is where the variable will be kept at runtime. In contrast, the value stored in a variable at runtime (its r-value) is not known until runtime.

论坛徽章:
0
28 [报告]
发表于 2006-03-22 09:02 |只看该作者
原帖由 p4apple 于 2006-3-21 20:11 发表
strncpy 结尾没有‘/0‘ 吧?


把那个‘吧’字去了

论坛徽章:
0
29 [报告]
发表于 2006-03-22 12:04 |只看该作者
原帖由 高峰 于 2006-3-21 20:47 发表
举个简单的例子:
我经常见到有人写这样的句子:

char *str;
str = (char *)malloc( SIZE );
memset( str, 0x00, SIZE );
strcpy( str, "hello, world" );

这里的 memset 很显然就是不必要 ...


是啊,我也同意。为什么会误导人?我觉得这样很顺眼啊?
memset()清0很正常啊!哪位给解释解释!

论坛徽章:
0
30 [报告]
发表于 2006-03-22 13:26 |只看该作者
原帖由 ehuangmy 于 2006-3-22 12:04 发表


是啊,我也同意。为什么会误导人?我觉得这样很顺眼啊?
memset()清0很正常啊!哪位给解释解释!


memset , 和紧接在后面的strcpy都是起到对变量的初始化作用
连续初始化两次, 不是很好看
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP