+ -
当前位置:首页 → 问答吧 → [赋值疑惑]

[赋值疑惑]

时间:2010-08-05

来源:互联网

  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <stdio.h>

  4. int main(int argc, char *argv[])
  5. {
  6.         char *str = "Hello World";
  7.         char string[20];
  8.         memcpy(string, str, strlen(str));
  9.         string[strlen(str)] = 0;
  10.         printf("%s", string);
  11.         return 0;
  12. }
复制代码
第十行是什么意思?

作者: allmycheers   发布时间: 2010-08-05

回复 allmycheers
\0

作者: tajial   发布时间: 2010-08-05

回复 allmycheers


    这段代码是谁写的啊!无语了。

作者: zhangsuozhu   发布时间: 2010-08-05

习惯不好

作者: lqq_1229   发布时间: 2010-08-05



QUOTE:
回复  allmycheers


    这段代码是谁写的啊!无语了。
zhangsuozhu 发表于 2010-08-05 11:49




   一本书上的,咋了?

作者: allmycheers   发布时间: 2010-08-05



QUOTE:
回复  allmycheers
\0
tajial 发表于 2010-08-05 11:44




    你的意思是在字符串后加上字符串结束符 阿,书上写0,我没看出来。

作者: allmycheers   发布时间: 2010-08-05



QUOTE:
回复  allmycheers


    这段代码是谁写的啊!无语了。
zhangsuozhu 发表于 2010-08-05 11:49


这代码写的有问题吗?

作者: donglongchao   发布时间: 2010-08-05

本帖最后由 ahui886 于 2010-08-05 12:15 编辑


QUOTE:
第十行是什么意思?
allmycheers 发表于 2010-08-05 11:38




9-10行合并,就是这个意思:
  1. memcpy(string, str, sizeof(str));
复制代码
呵呵,搞错啦,sizeof(str)只能得到指针的长度
  1. memcpy(string, str, strlen(str)+1);
复制代码

作者: ahui886   发布时间: 2010-08-05



QUOTE:
9-10行合并,就是这个意思:
ahui886 发表于 2010-08-05 11:57


作者: donglongchao   发布时间: 2010-08-05

memcpy拷贝字符串,但是此时没有将字符串的终结符'\0'拷贝过来,所以用那个赋值加上
之所以说代码那啥,是因为反复调用了strlen,而strlen每次都遍历一次str,效率就下来了,个人建议可以用个变量来暂存一下

作者: daybreakcx   发布时间: 2010-08-05



QUOTE:
你的意思是在字符串后加上字符串结束符 阿,书上写0,我没看出来。
allmycheers 发表于 2010-08-05 11:56


'\0' 的ascii码就是 0

作者: tajial   发布时间: 2010-08-05

本帖最后由 zhangsuozhu 于 2010-08-05 13:47 编辑
  1. memcpy(string, str, strlen(str));
  2. string[strlen(str)] = 0;
复制代码
用一句不就行了
  1. strcpy(string, str);
复制代码
更严谨点的可以用 strncpy当然, 如果100%确定sizeof(string) > strlen(str),可以不用strncpy
即便是用memcpy加个变量效率会提升很高
  1. char string[20] = {0};
  2. size_t len = strlen(str);
  3. len = sizeof(string) > len +1? len : sizeof(string) - 1;
  4. memcpy(string, str, len);
复制代码

作者: zhangsuozhu   发布时间: 2010-08-05

本帖最后由 ahui886 于 2010-08-05 12:13 编辑


QUOTE:
donglongchao 发表于 2010-08-05 11:59




    不知道你吐的什么?你是想说该用strcpy么?
效率一定比memcpy高么?

厄,我知道错了,sizeof(str)压根就得不到字符串的长度。

作者: ahui886   发布时间: 2010-08-05



QUOTE:
不知道你吐的什么?你是想说该用strcpy么?
效率一定比memcpy高么?
ahui886 发表于 2010-08-05 12:04




    mem里,不但只copy,而且用了二次strlen

strcpy应该会比 memcpy+2* strlen 快吧!

作者: zhangsuozhu   发布时间: 2010-08-05

回复 donglongchao


    吐的好啊,忙了一上午,脑袋晕了,低级错误啊,写出那的代码的确该吐啊
面壁去拉...

作者: ahui886   发布时间: 2010-08-05

回复 zhangsuozhu


    str声明形式是:char *str = "Hello World";
这样的静态量能用strcpy修改吗?

作者: 346flytiger   发布时间: 2010-08-05

回复 346flytiger


    strcpy(string,str);
LZ要修改的是string

作者: zhangsuozhu   发布时间: 2010-08-05

回复 zhangsuozhu


        

    不好意思啊,看走眼了。。。。。。下次一定认真改正。。。

作者: 346flytiger   发布时间: 2010-08-05

回复 346flytiger


    嗯。这段代码的命名容易混

作者: zhangsuozhu   发布时间: 2010-08-05

回复 zhangsuozhu


    很8错,

作者: 奶茶dsk   发布时间: 2010-08-05

呵呵,去看看GNU的代码吧,除了奇淫异巧还有比这个更shit的代码。
兼任那些代码,简直太难了,++!

作者: prolj   发布时间: 2010-08-05

回复 ahui886
休息休息就好啦。

作者: donglongchao   发布时间: 2010-08-05

相关阅读 更多

热门下载

更多