我不明白我做错了什么。看起来这应该有效:
调用reverse_reverse(“这个房子是蓝色的”); 应该首先打印出“这房子是蓝色的”,然后“蓝色就是这个房子”..
void reverse_reverse(char * str) {
char temp;
size_t len = strlen(str) - 1;
size_t i;
size_t k = len;
for(i = 0; i < len; i++) {
temp = str[k];
str[k] = str[i];
str[i] = temp;
k--;
if(k == (len / 2)) {
break;
}
}
cout << str << endl;
i = 0;
for(k = 0; k < len; k++) {
if(str[k] == ' ') {
size_t a = k;
for(size_t b = i; b < k; b++) {
temp = str[b];
str[b] = str[a];
str[a] = temp;
a--;
if(a == (((k - i) / 2) + i)) {
break;
}
}
}
i = k + 1;
}
cout << str << endl;
}
答案 0 :(得分:5)
你有
i = k+1
然后是for循环
for(size_t b = i; b < k; b++)
这在循环开始之前永远不会以i > k
进入b > k
。
也许你的意思是在if块中有这一行:
if (str[k] == ' ') {
...
i = k+1; // <----- Here
}
// i = k+1; // Instead of here.
我认为这也不会奏效,但会让你更接近你想要的东西。
答案 1 :(得分:1)
如果代码更简单,那么阅读,理解和调试代码会更容易。请注意,您重复代码以在两个不同的位置反转字符序列 - 您应该使用子例程。比您正在使用的算法更简单,更直观,更快速的算法
/* reverse s[first ... last] in place */
void reverse(char* s, int first, int last){
for( ; first < last; first++, last-- ){
char c = s[first];
s[first] = s[last];
s[last] = c;
}
}
然后你的程序简化为:
void reverse_reverse(char* s) {
int len = strlen(s);
reverse(s, 0, len - 1);
for( int word = 0, i = 0;; i++ ){
if( i == len || s[i] == ' ' ){
reverse(s, word, i-1);
if( i == len ) break;
word = i + 1;
}
}
}
请注意,我在for循环中移动了结束测试,以处理字符串中的最后一个单词,如果它后面没有空格。
答案 2 :(得分:0)
不是将整个字符串反转一次然后再反转每个单词,而是可以执行以下操作:
void reverse(const char *s)
{
int e = strlen(s) - 1;
int b = e;
while (b) {
while (b && s[b - 1] != ' ')
b--;
int i;
for (i = b; i <= e; ++i)
putchar(s[i]);
while (b && s[b - 1] == ' ') {
printf(" ");
b--;
}
e = b - 1;
}
}