2016-05-13 34 views
0
#include <iostream> 
#include <cstring> 
using namespace std; 




void reverseString(char s[]) 
{ 
    int length = strlen(s); 
    for (int i = 0; s[i] != '\0'; i++) { 
     char temp = s[i]; 
     s[i] = s[length - i - 1]; 
     s[length - i - 1] = temp; 

     cout << s[i]; //this ends up printing "eooe" instead of reversing the whole string 
    } 
} 

int main() 
{ 
    char a[] = "Shoe"; 
    reverseString(a); 

    return 1; 
} 

我想知道算法弄亂了什麼,我能做些什麼來修復它,也許我忽略了一些東西,因爲當我試圖在一張紙上解決它時,它似乎正常工作。函數不會正確地反轉字符串

+0

反向算法很好 - 在for循環結束後嘗試放置'cout << s;'。 – jjm

+0

@jjim不會只是打印出通過函數傳遞的參數,而不會被顛倒過來嗎? –

+0

不,你正在修改字符串。 – jjm

回答

0

使用下面的代碼:

#include <stdio.h> 

void strrev(char *p) 
{ 
    char *q = p; 
    while(q && *q) ++q; 
    for(--q; p < q; ++p, --q) 
    *p = *p^*q, 
    *q = *p^*q, 
    *p = *p^*q; 
} 

int main(int argc, char **argv) 
{ 
    do { 
    printf("%s ", argv[argc-1]); 
    strrev(argv[argc-1]); 
    printf("%s\n", argv[argc-1]); 
    } while(--argc); 

    return 0; 
} 
+0

儘管這段代碼可能會回答這個問題,但最好包含一些上下文,解釋它的工作原理以及何時使用它。從長遠來看,僅有代碼的答案是沒有用的。 – Bono

+0

我們有一個主要的'char * p',我們將'p'地址複製到'q'指針中。之後,我們將'q'地址從第一個字符串移動到'while'循環的字符串結尾。然後我們用'for'循環和XOR運算符(用位操作)將第一個值替換爲最終值。如果你想知道,請舉例說明。 –

2

你的算法中是正確的,但需要一點點修改,你必須爲length/2時間運行算法。它可以防止您的字符串再次交換內容,即在i = 2您的s = eohs,但它再次交換ho。嘗試插入斷點以進一步瞭解它。我稍微修改你的功能。

char* reverseString(char s[]) 
{ 
    int length = strlen(s); 
    for (int i = 0; i<length/2; i++) 
    { 
     char temp = s[i]; 
     s[i] = s[length - i - 1]; 
     s[length - i - 1] = temp; 
     //cout << s[i]; //this ends up printing "eooe" instead of reversing the whole string 
    } 

    return s; 
} 

int main() 
{ 
    char a[] = "Shoe"; 
    cout<<reverseString(a); 
    system("pause"); 
    return 1; 
}