1

我有这两个功能做同样的事情(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++; 
   } 
} 

C程序员通常更喜欢哪种风格/实现?“数组”方法还是“指针”方法?两种实现之间除了“美学”差异之外还有其他差异吗?

4

5 回答 5

3

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

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

于 2012-11-27T15:00:14.980 回答
1

正如 Didier 所指定的,机器生成的代码看起来是一样的,并且在这种情况下的性能也将是相同的。但是,我建议

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

2) 更好地从 src 端复制到 des 端而不是从头开始;bcz 想一想,如果 src 从地址 105 开始,大小为 10,而 des 从地址 100 开始,则 src 数据将覆盖 des 的 105 地址。它说“des”应该拥有真正的价值,然后是src。

于 2012-11-27T19:18:15.447 回答
0

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

于 2012-11-27T14:58:03.090 回答
-1

第一个实现,即数组实现是正确的和首选的。但这取决于程序员。最佳做法是不要更改/更改指针,即应保留起始/基地址,不应递增或递减。

于 2012-11-27T16:29:20.073 回答
-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 用作“先前值”

于 2012-11-27T14:58:58.620 回答