在空间功能之后优化反转词和大写词

时间:2016-05-06 05:22:10

标签: c++ c

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

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

3 个答案:

答案 0 :(得分:0)

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

1。使用for循环代替while循环。此

int i = 0;
while ( i < 10 )
{
    // loop body
    i++;
}

最好写成

for ( int i = 0; i < 10; i++ )
{
    // loop body
}

2。首次使用时声明变量。例如,temp的声明可以在循环内完成。

3。使用数组语法而不是指针算法。例如,这个

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

最好写成

string[i] = string[j];

考虑到这一点,反转字符串的代码可以写成

for ( int i = 0, j = strlen(string)-1; i < j; i++, j-- )
{
    char temp = string[i];
    string[i] = string[j];
    string[j] = temp;
}

正如评论中所提到的,将单词首字母大写的代码存在一些问题。问题中的算法使string指针前进,直到它指向空格字符,然后将字符大写到地址string+1

替代算法保留前一个字符的副本。如果前一个字符是空格,则当前字符大写。这是该算法的一种实现:

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

请注意,这将大写字符串中的第一个字符以及空格后面的任何字符。如果您特别只想大写字母后面的字符,而不是第一个字符,那么请更改oldc的初始化,这样就不会以空格开头,例如

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

答案 1 :(得分:0)

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

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

以下是如何实施的示例:

#include <stdio.h>
#include <string.h>
#include <ctype.h>

void transform(char* s)
{
  char temp;

  char* endPtr = s + strlen(s) - 1;

  while (s < endPtr)
  {
    /* 
      converting left hand part like 'c ' to 'C ' 
      so that after swap it turns to ' C' 
    */
    if (!isspace(*s) && isspace(*(s + 1)))
      *s = toupper(*s);

    /* same to the right side */
    if (isspace(*endPtr) && !isspace(*(endPtr - 1)))
      *(endPtr - 1) = toupper(*(endPtr - 1)); 

    /* swap */
    temp = *s;
    *s = *endPtr;
    *endPtr = temp;

    s++;
    endPtr--;
  }
}

int main(void)
{
  char str[] = "this is a demo string! the one and only  real demo string. crazy example ";

  transform(str);

  printf("'%s'\n", str);

  return 0;
}

答案 2 :(得分:-1)

您可以在使用xor operation

进行反转时删除temp变量
    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;
    }

要将每个字母大写,请尝试使用以下代码:

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

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