比如说给定一字符串 " I Love ShanLiJuan " 那么它的逆向输出就是"ShanLiJuan Love I " 这里空白符作为单词的分割符。
方案一:
使用标记法,需要一个缓存区。但是比较容易理解, 就是逆向扫描源字符串,把每个单词正向拷贝到缓存区,代码如下:
void ReverseWord(char* p_string)
{
int word_read_pos = 0;
int word_end_pos = 0;
int word_write_pos = 0;
int word_token_pos = 0;
char* buffer = NULL;
word_token_pos = strlen(p_string) - 1;
buffer = new char[word_token_pos + 2];
while(word_token_pos >= 0)
{
if(p_string[word_token_pos] == ' ')
{
buffer[word_write_pos] = p_string[word_token_pos];
word_token_pos--;
word_write_pos++;
}
else
{
word_end_pos = word_token_pos;
while(word_token_pos >= 0 &&p_string[word_token_pos] != ' ')
word_token_pos--;
word_read_pos = word_token_pos + 1;
while(word_read_pos <= word_end_pos)
buffer[word_write_pos++] = p_string[word_read_pos++];
}
}
buffer[word_write_pos] = '/0';
strcpy(p_string,buffer);
delete buffer;
}
方案二: 不使用缓存区。
步骤:
1 首先对输入的源字符串做交换操作。
2 对由步骤1产生的字符串正向扫描,对每个单词对交换操作。代码如下:
void ReverseWordMethod(char* start,char* end)
{
while(start < end)
{
char tmp = *start;
*start = *end;
*end = tmp;
start++;
end--;
}
}
void ReverseString(char* psz)
{
char* p_end = (char*)(&psz[strlen(psz) - 1]);
char* p_start = psz;
int start_pos = 0;
int end_pos = 0;
int scan_length = strlen(psz) - 1;
ReverseWordMethod(p_start,p_end);
while(start_pos <= scan_length)
{
if(psz[start_pos] != ' ')
{
end_pos = start_pos;
while(end_pos <= scan_length && psz[end_pos] != ' ')
end_pos++;
ReverseWordMethod((char*)(&psz[start_pos]),(char*)(&psz[end_pos - 1]));
start_pos = end_pos;
}
else{
start_pos++;
}
}
}