反向C风格的字符串? - C ++

时间:2010-02-04 05:01:31

标签: c++ pointers arrays

我想使用指针来反转C ++中的char数组。我想知道是否有什么我应该采取不同的做法?我这样做了吗?有没有更有效的方法来实现这一目标?

我的小程序:

int main ( )
{
    char buffer[80];

    PrintHeader();

    cout << "\nString reversal program";
    cout << "\nType in a short string of words.";
    cout << "\nI will reverse them.";
    cout << "\n:";
    cin.getline(buffer, 79);

    cout << "\nYou typed " << buffer;
    reverse (buffer);
    cout << "\nReversed: " << buffer;

    cout << endl;
    system("PAUSE");
    return 0;

}


void reverse(char* string)
{
    char* pStart, *pEnd;
    int length;
    char temp;

    length = strlen(string);

    pStart = string;
    pEnd = &string[length - 1];

    while(pStart < pEnd)
    {
        temp = *pStart;
        *pStart = *pEnd;
        *pEnd = temp;
        pStart++;
        pEnd--;
    }
}

5 个答案:

答案 0 :(得分:9)

void str_reverse( char *str ) {
    char *str_end = strchr( str, 0 );
    std::reverse( str, str_end );
}

如果你应该写一个循环,

void str_reverse( char *str ) {
    std::size_t len = std::strlen( str );
    for ( std::size_t index = 0; index != len / 2; ++ index ) {
        std::swap( str[ index ], str[ len - index - 1 ] );
    }
}

,当然,如果你可以使用C ++字符串,

void str_reverse( std::string &str ) {
    std::reverse( str.begin(), str.end() );
}

答案 1 :(得分:3)

假设你不能使用除C字符串函数以外的任何东西,我会

  • 避免在函数开头预先声明变量。这是C(使用1990标准)的要求,但在C ++中,在使用它们时声明和初始化变量更为惯用。

  • 如果字符串为空,则避免超出界限(减少超出字符串的开头)。

类似于:

void reverse(char* string)
{
    char* first = string;
    char* last = string + strlen(string);

    while(first < last)
    {
        --last; //avoids decrementing last beyond start of string if string is empty
        char temp = *first;
        *first = *last;
        *last = temp;
        ++first;
    }
}

答案 2 :(得分:1)

您可以使用std::swap(*pStart, *pEnd)代替开放式代码交换。

哎呀,你可以使用std::reverse(buffer, buffer + strlen(buffer))。但我想这不会真的自己使用指针,并且考虑到这个要求,它看起来很好。

嗯,实际上,一点点:如果length==0,那么&string[length - 1]没有指向字符数组,理论上它不是一个有效的指针。

答案 3 :(得分:0)

你的确没有什么问题我会远离使用知名的类型名称作为变量,例如字符串,因为这会让其他人感到困惑。只是为了一个方法,你可以做到这一点。

void RevBuff(char* Buffer)
{

int length = strlen(Buffer);
char * CpBuff = _strdup(Buffer);
for(int i = length -1, x = 0; i >=0 ; i--, x++)
{
    Buffer[x] = CpBuff[i];
}
free(CpBuff);
}

然而,如上所述,如果你能找到一个库代码,你几乎总是希望在你自己的代码上使用库函数(你不知道有多少次我见过专业程序员编写存在于标准库中的代码很容易被谷歌搜索发现,但我离题了。

答案 4 :(得分:0)

您的代码非常详细并且枚举了每个操作,例如选择字符串的长度或将指针指定给字符串的末尾或使用辅助变量来交换值。

有很多方法可以提高效率(正如其他答案所证明的那样),但可以说更准确。您的解决方案将代码清晰度放在性能之前,这是一种值得称赞的习惯。

当然,代码可以用尽可能多的指令编写,但是优化编译器将完成与代码相同的工作(可以通过一些巧妙的编码来完成一些循环),但是您的可读性更高。

当然,如果你真的想要一些极端的性能提升(但是更长的字符串,可能是数兆字节的数据),这对GPU来说是一个完美的工作。它将使用50倍的时间来设置操作,然后使用当前CPU时间的一小部分来执行操作。