比较strcpy()的两个实现

时间:2012-11-27 14:55:15

标签: c arrays pointers

我有这两个函数做同样的事情(strcpy()函数):

首次实施:

void strcpy(char* des_str, const char* src_str) 
{ 
   int j = 0; 
   while ((dest_str[j] = src_str[j])!= '\0')) 
   j++; 
}

第二次实施:

void strcpy(char* des_str, const char* src_str) 
{ 
   while ((*dest_str = *src_str)!= '\0')) 
   { 
      src_str++;
      dest_str++; 
   } 
} 

程序员通常更喜欢哪种样式/实现?{1} "数组" 方法或"指针" 方法?除了"美学和#34;之外是否存在差异?两种实现之间的差异?

5 个答案:

答案 0 :(得分:3)

我敢打赌,生成的机器代码对两者都完全相同。 (有优化)

因此,这只是一个可读性问题:使用您和您的团队最熟悉的版本。这里最重要的是,当任何程序员看到这个源代码时,他/她不必浪费时间思考这个函数的作用。

答案 1 :(得分:1)

根据Didier的说明,机器生成的代码看起来相同,在这种情况下的性能也是一样的。但是,我建议

1)使用strncpy而不是使用strcpy。          strncpy(des,src,noOfcharToCopy);

2)从src end到des end的更好复制,而不是从开始开始;    bcz想到的情况,如果src从地址105开始并且它的大小为10且des开始于    地址100然后src数据将覆盖在105地址的des。    它说“des”应该保持真正的价值,然后src。

答案 2 :(得分:0)

这取决于我所说的程序员。 主要的区别在于,在第一个实现中创建一个新变量并只修改这个变量,在第二个实现中修改两个现有变量。这是一个大小与速度的问题(但规模要小得多)

答案 3 :(得分:-1)

首先实现,即阵列实现是正确和优选的。 但这取决于程序员。最佳做法是不更改/改变指针,即应保留起始/基址,不应增加或减少。

答案 4 :(得分:-2)

据我所知,这个更常见:

void strcpy(char* des_str, const char* src_str) 
{ 
  while ((*dest_str = *src_str)!= '\0')) 
  { 
    src_str++;
    dest_str++; 
  } 
} 

我只能假设因为它不需要分配任何内存(int) 虽然更准确,但我认为它通常实现为

++src_str
++dest_str

因为后缀增量必须创建一个新的int,以便在增加之前用作“之前的值”