预测C代码中的缺陷

SAM*_*SAM 1 c

最近我参加了一次采访,有几个问题,我必须找到代码中的缺陷.以下是问题.

void fun(char *p)   
{    
    int a = 0;

    int b = strlen(p) - 1;

    int d = 0;

    while(d == 0)
    {
        if(a == b)
        {
            d = 1;
        }
        else
        {
            char t = *(p + a);
            *(p + a) = *(p + b);
            *(p + b) = t;

            a += 1;
            b -= 1;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的回答是:

  1. NULL检查p.
  2. 错误的条件if(a == b).如果字符串的长度是偶数,则这种情况永远不会满足.

如果有人发现任何其他缺陷,请告诉我,并且欢迎任何对我给出的答案的评论.

Lun*_*din 5

代码的目的是在分配字符串的位置反转字符串.问题是:

错误

  • 正如您已经指出的那样,a==b只适用于奇数长度的字符串.可能是面试问题所寻求的.

    (检查pNULL可能是也可能不是必需的.你无法从发布的代码中看出:它取决于函数的文档.对于通用函数,将该检查留给调用者是最有意义的.)

编码风格

  • 无意义的变量和函数名称.
  • p[a]之前是首选,*(p + a)因为它更具可读性.
  • 循环终止条件非常丑陋且多余.我更喜欢while(a < b),这也将修复上述错误.
  • size_t应该用来代替int.
  • 没有评论或源代码文档.

代码应该重写为这样的(未经测试):

#include <string.h>

void str_reverse (char* str)   
{    
  size_t start = 0;
  size_t end = strlen(p) - 1;

  while(start < end)
  {
    char tmp   = str[start];
    str[start] = str[end];
    str[end]   = tmp;

    start++;
    end--;
  }
}
Run Code Online (Sandbox Code Playgroud)

请注意,现在实际上不再需要注释,因为变量和函数名称使代码自我记录.