强大的字符串反转

p1.*_*p1. 2 c string swap

我正在尝试编写一个扭转字符串的trival面试问题.

这是我的代码:

#include <string.h>

char* rev( char* str)
{
    int i,j,l;

    l = strlen(str);

    for(i=0,j=l-1; i<l/2 ; i++, j--)
    {
        str[i] = (str[i] + str[j]);
        str[j] = str[i] - str[j];
        str[j] = str[i] - str[j];
    }

    return str;
}

int main()
{
    char *str = " hello";
    printf("\nthe reverse is %s ...", rev(str));

    return 1;
}
Run Code Online (Sandbox Code Playgroud)

基本上,这个给出了分段错误.

我有以下问题:

  1. 我得到分段错误可能是因为,字符加起来没有在ascii中定义,因此我不能将它们存储为字符,我正在使用www.codepad.org [我想知道它是否支持ascii !!].我的理解是正确的还是还有别的东西.

  2. 我如何纠正问题,对于同一平台[我的意思是为codepad.org交换]

  3. 在这里,我必须使用额外的整数l来计算长度.所以通过交换来保存单个字符空间..我正在使用额外的int !!! ..只是为了给观众留下深刻印象:) ...这种做法前夕值得!

  4. 这个是针对那些有兴趣编写单元测试/ API测试的人.我希望有一个强大的实现,所以可能的测试用例.我假设如果面试官问这么简单的问题......他肯定想要一些非常抢劫的实施和测试用例.我很少想到:

    • 传递空字符串传递整数

    • 字符串传递整数数组而不是char数组.

    • 很长的弦,

    • 单个字符串字符串的特殊字符.

任何建议/建议都会有所帮助.

Car*_*rum 8

这一行:

char *str = " hello";
Run Code Online (Sandbox Code Playgroud)

可能指向只读内存.试试这个:

char str[] = " hello";
Run Code Online (Sandbox Code Playgroud)

(您还有其他一些错误,但此更改将修复您的段错误).


alt*_*ive 7

使用临时变量而不是您的交换方法.由于优化,编译器可能会使用寄存器作为临时变量.

无论哪种方式,您都错误地实现了交换算法.它应该是

str[i] = str[i] + str[j];
str[j] = str[i] - str[j];
str[i] = str[i] - str[j];
Run Code Online (Sandbox Code Playgroud)


csc*_*hol 5

Kernighan&Ritchie的第62页C编程语言显示了一个带有临时变量的就地字符串反转算法.

与此类似:

char* rev_string(char* const str)
{
  int i, j;
  char tmp;
  for(i = 0, j = strlen(str)-1; i < j; i++; j--)
  {
    tmp = str[i];
    str[i] = str[j];
    str[j] = tmp;
  }
  return str;
}
Run Code Online (Sandbox Code Playgroud)

这个算法比没有临时变量imho的算法更容易理解.

至于问题列表中的第3项:

作为一名采访者,我希望看到简单,清晰,结构良好的代码.这很让人佩服.诡计不会让我印象深刻.特别是当它出现过早优化时.顺便说一句,我的解决方案使用一个额外的char而不是int来反转字符串.令人印象深刻的?:)

和第4项:

另一个测试用例是未终止的字符串.你的功能是否足够强大以处理这种情况?您的功能只会像它最不健壮的部分一样健壮.将未终止的字符串传递到我的解决方案会导致分段错误,因为strlen报告的字符串长度不正确.不是很强大.

关于健壮性的重点是,您的代码可能很健壮,但您必须确保您使用的所有其他外部函数也是如此!