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++;
}
}
我只是想知道是否有更好的方法来进行此输出,尤其是使用较少的代码行生成相同的输出
答案 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++;
}
我还没有对代码进行测试,但我认为它应该可行。