我正在尝试编写一个反转字符串的普通采访问题。

这是我的代码:

#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;
}


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

我有以下问题:


我出现分段错误,可能是因为字符加起来没有在ascii中定义,因此我无法将它们存储回字符,我正在使用www.codepad.org [我想知道它是否仅支持ascii !!]。我的理解正确吗,或者还有其他东西。
对于相同的平台,我该如何解决该问题[我的意思是在适当位置交换codepad.org]
在这里,我必须使用其他整数l来计算长度。因此,通过交换就可以节省单个字符空间..我正在使用额外的int !!! ..只是打动了inteviewer :) ...这种方法值得值得!
这是针对那些对编写单元测试/ API测试感兴趣的人的。我希望有一个健壮的实现,以便可能的测试用例。我认为,如果面试官提出这样一个简单的问题,那么他肯定会想要一些非常强大的实施和测试用例。我很少想到:


传递空字符串,传递整数
字符串传递整数数组代替
字符数组。
很长的弦
单个字符字符串特殊字符的字符串。



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

最佳答案

从哪儿开始...

好的,首先您应该知道例程会在原地反转一个字符串,换句话说,就是对原始缓冲区进行了更改。

这意味着你可以做

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

    return 0;
}


并且该字符串将被反转。

另一种选择是创建一个新字符串,该字符串是原始字符串的反向副本。算法有些不同,您也应该能够做到这一点。

下一点:

    str[i] = (str[i] + str[j]);
    str[j] = str[i] - str[j];
    str[j] = str[i] - str[j];


被打破。它应该是

    str[i] = str[i] + str[j];
    str[j] = str[i] - str[j];
    str[i] = str[i] - str[j];


但是,正如〜mathepic所说,您应该改为这样做:

    temp = str[i];
    str[i] = str[j];
    str[j] = temp;


另外:键盘使调试代码变得困难。在自己的计算机上安装编译器和调试器(例如gcc和gdb)。


字符加起来没有在ascii中定义,因此我无法将它们存储回字符,我正在使用www.codepad.org [我想知道它是否仅支持ascii !!]。我的理解正确吗,或者还有其他东西。


在大多数C实现中(无论如何都在32位PC上运行),char是8位整数。 int是32位整数。当您加上或减去两个char且结果超过8位时,它将“环绕”到其他某个值,但是此过程是可逆的。

例如,255 + 1给出0,但0-1 =255。(仅作为示例)。这意味着“我不能将它们存储为字符”不是这里的问题。


我想要一个稳健的实施


您想证明自己已经考虑了不同设计选择的成本和收益。如果您的例程提供了NULL,则最好引起分段错误,因为这会很快提醒程序员代码中的错误。


传递空字符串


您必须确保您的代码可以在这种情况下工作。


传递整数
传递整数数组


您不能将整数或int []传递给期望char *的函数。在C语言中,您无法确定char *确实是字符串还是其他。


单字符字符串


确保您的例程适用于单个char字符串,也适用于具有奇数和偶数个字符的两个字符串。


一串特殊字符


C中没有特殊的char(根据约定,空终止符'\ 0'除外)。但是,必须考虑multi- char序列(反转UTF-8字符串与反转常规字符串不同)。但是,如果问题未明确说明,我认为您不必为此担心。

最后三点:


main()中,return 1;通常表示您的程序失败。 return 0;更常见,但return EXIT_SUCCESS;最佳,尽管您可能需要#include <stdlib.h>
考虑使用更具描述性的变量名。
考虑制作一个类似于strnrev()和类似函数的strncpy()函数,如果在该函数中找不到空终止符,则该函数将不会超出n字符。

关于c - 健壮的字符串反向,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1698143/

10-11 19:36
查看更多