最近我参加了一次采访,有几个问题,我必须找到代码中的缺陷.以下是问题.
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)
我的回答是:
NULL检查p. if(a == b).如果字符串的长度是偶数,则这种情况永远不会满足.如果有人发现任何其他缺陷,请告诉我,并且欢迎任何对我给出的答案的评论.
代码的目的是在分配字符串的位置反转字符串.问题是:
错误
正如您已经指出的那样,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)
请注意,现在实际上不再需要注释,因为变量和函数名称使代码自我记录.