将一个字符串按照单词反序,如输入字符串是"I am a programmer", 则输出字符串是"programmer a am I"
输入字符串,两个参数可以表示:char * inStr, int inLen,
输出字符串,不要用返回字符串/指针的方式,而是也用参数,如:char * outStr
如果函数不需要返回,则令其为void
注意,当输入参数包含指针时,请在函数开始部分做非空判断(ASSERT),如ASSERT(inStr != NULL)。
如有必要禁止空字符输入,也可以ASSERT(inLen > 0)
函数名可以由它要完成的功能决定,不确定的时候也可以直接用foo或者fun
综上,本题的函数定义可以是:
void reverse(char * inStr, int inLen, char * outStr)
{
ASSERT(inStr != NULL && outStr != NULL)
...
}
接下来进行算法设计和实现。
in I am a programmer
start ^
end ^
out programmer a am I@
outPos ^
void reverse(char * inStr, int inLen, char * outStr)
{
ASSERT(inStr != NULL && outStr != NULL)
int wordEnd = inLen -1;
int wordStart = wordEnd;
int outPos = 0;
while (true)
{
if (intStr[wordStart] == ' ' || wordStart < 0)
{
if (wordStart == wordEnd)
{
if (wordStart < 0)
{
break;
}
wordStart--;
wordEnd--;
}
else
{
for (int i=wordStart + 1; i<=wordEnd; i++)
{
outStr[outPos++] = inStr[i];
}
if (wordStart < 0)
{
break;
}
else
{
outStr[outPos++] = ' ';
wordEnd = wordStart;
}
}
}
else
{
wordStart--;
}
}
outStr[outPos] = '/0';
}
* 如果不增加额外空间,而是在原字符串上反转?
#include "stdafx.h"
#include <assert.h>
#include <string.h>
void reverse(char *str, int len);
int _tmain(int argc, _TCHAR* argv[])
{
char str[]="Defines the entry point for the console application";
reverse(str,strlen(str));
printf("%s/n", str);
getchar();
return 0;
}
void reverseWord(char *word, int wordStart, int wordEnd);
void reverse(char *str, int len)
{
assert(str!=NULL);
char * wordStart;
char * wordEnd;
wordStart = wordEnd = str;
while(true)
{
if (*wordEnd == ' ' || *wordEnd == '/0')
{
if (wordStart != wordEnd)
{
reverseWord(str, wordStart-str, wordEnd-1-str);
}
if (*wordEnd == '/0')
{
break;
}
wordEnd ++;
wordStart = wordEnd;
}
else
{
wordEnd++;
}
}
reverseWord(str, 0, len-1);
}
void reverseWord(char *word, int wordStart, int wordEnd)
{
for(char * left = word+wordStart; left < word + wordStart + (wordEnd-wordStart+1)/2; left ++)
{
char * right = word + wordEnd - (left -word - wordStart);
char temp = *left;
*left = *right;
*right = temp;
}
}