C++ 优化倒装词,同时在空格函数后大写单词

C++ 优化倒装词,同时在空格函数后大写单词,c++,c,C++,C,我只是想知道是否有更好的方法来生成此输出,尤其是用更少的代码行生成相同的输出您可以在使用xor操作反转时删除temp变量 void inverse(char *string) { int i = 0; int j = strlen(string) - 1; char temp; //Inverse the order while ( i < j ) { temp = *( string + i ); *(

我只是想知道是否有更好的方法来生成此输出,尤其是用更少的代码行生成相同的输出

您可以在使用xor操作反转时删除temp变量

void inverse(char *string) 
{
    int i = 0;
    int j = strlen(string) - 1;
    char temp;

    //Inverse the order
    while ( i < j )
    {
        temp = *( string + i );

        *( string + i ) = *( string + j );
        *( string + j ) = temp;

        i++;
        j--;
    }   

    //Capitalize letter after space
    while( *string != '\0')
    {
        if ( *( string ) == ' ' && *( string + 1 ) != ' ')
        {
            *( ++string ) = toupper( *( string ) );
        }
        string++;
    }
}
要将每个字母大写,请尝试使用以下代码:

    int end= strlen(string)-1;
    int start = 0;

    while( start<end )
    {
    string[start] ^= string[end];
    string[end] ^= string[start];
    string[start]^= string[end];

    ++start;
    --end;
    }

我还没有对代码进行测试,但我认为它应该可以工作。

一些清理和减少代码行数的一般提示:

一,。使用for循环而不是while循环。这个

char* reversestr = *string;
while( *reversestr != '\0')
{
    if (i==0 || *(reversestr - 1) ==' ' && *reversestr >= 'a' && *reversestr <= 'z')
           *reversestr = toupper(*reversestr);
    reversestr++;
}
最好写为

int i = 0;
while ( i < 10 )
{
    // loop body
    i++;
}
*( string + i ) = *( string + j );
string[i] = string[j];
考虑到这一点,反转字符串的代码可以写成

int i = 0;
while ( i < 10 )
{
    // loop body
    i++;
}
*( string + i ) = *( string + j );
string[i] = string[j];
请注意,这将使字符串中的第一个字符以及空格后面的任何字符大写。如果您特别希望大写紧跟在空格后面的字符,而不是第一个字符,请更改oldc的初始化,使其不以空格开头,例如

for ( char oldc = ' '; *string != '\0'; string++ )
{
    if ( oldc == ' ' )
        *string = toupper(*string);
    oldc = *string;
}

哦,你可以大大优化它。让我们先回顾一下逻辑

我们需要在结果字符串中使空格后面的每个字符都大写。这是什么意思?这意味着在原始字符串中,这些字符位于空格之前。因此,我们有条件找到原始字符串中的字符,并在交换之前将它们变成大写。这使得第二个循环变得不必要——我们可以在一个循环中完成所有工作

下面是如何实现的示例:

for ( char oldc = 'a'; *string != '\0'; string++ )

与其尝试优化,不如尝试将其正确化:资本化调用未定义的行为,因为不清楚lhs上的增量是在访问rhs上的同一变量之后还是之前发生的。您还遗漏了第一个字符,并尝试在字符串以空格结尾时大写空终止符,这可能不会造成任何伤害,但仍然如此。在我看来,该函数应分为两个单独的函数:一个用于反转字符串,另一个用于大写单词的第一个字母。每一个函数都做一件明确定义的事情,然后你可以独立地调用它们。你的反向很好,你在每次迭代中处理两端。你的资本化也很好。您始终可以展开循环并一次搜索4个字符以获得一些性能,但是如果字符串相对较短,小于1000个字符左右,则其好处可以忽略不计。对于任何更长的时间,你都会看到展开的收益。查看strlen源代码的示例-Agree需要有2个函数;将至少和你能写的任何东西一样快。你的空格循环对于像a这样的字符串被破坏后大写。忽略关于字符串递增的确切时间的未定义行为,您将递增字符串以指向\0,然后再次递增,并运行传入字符串的结尾。@ParamagneticCroissant是XOR不是一个好主意??那么大写的代码呢?在许多现代体系结构上,XOR技巧通常不会比使用临时代码进行交换更快,但它不太通用,更容易出错,并且不容易立即理解。它通常较慢。临时工很便宜。内存访问非常昂贵。对于int i=0,j=strenstring-1;i