2013-06-18 17 views
0

如何輸入一個詞並將其輸出反轉。我做了一個函數來計算單詞的長度,從這裏我必須根據它的長度來反轉單詞。 我該怎麼做?使用函數調用反轉一個詞

#include<iostream> 

using std::cout; 
using std::endl; 
using std::cin; 
int LengthOfString( const char *); // declaring prototype for length of the string 

int reverse(const char []); 


int main() 
{ 
    char string1[100]; 
    cout<<"Enter a string: "; 
    cin>>string1; 

    cout<<"Length of string is "<<LengthOfString(string1); 

    system("PAUSE"); 

    return 0; 
} 

int LengthOfString(const char *x) 
{ 
    int index; 
    for(index = 0; *x!='\0';x++,index++); 

    return index; 
} 

int reverse(const char y[]) 
{ 
/* my attempted loop, its not right i know. 
a[] = *index; // length of the word 
     for(int i=0; i<=index/2; i++) 
      for(j=0; j == length, j--) */ 

} 
+4

這聽起來像一個家庭作業的問題。 –

+0

你有沒有做過任何嘗試?你能向我們展示你認爲的解決方案嗎? – Shobit

+0

@DrewShafer不再有作業標籤。關於meta的iirc有一些討論。 – jpaugh

回答

0

聲明相同長度的新的char *,然後循環如下 -

for(int i=0;i<stringLength;i++){ 
    newString[i]=oldString[stringLength-i]; 
} 
return newString; 

另外你可能要考慮使用String類,而不是字符的*。

+0

我必須根據長度重複++這個詞,並再次重申 - – BaidNation

+0

@BaidNation我不確定你的意思。你至少了解我的解決方案,以及如何實施它? –

+0

我編輯了我的代碼。請參閱它。 – BaidNation

7

這個輪子已經發明瞭,存在於標準庫中。

#include <iostream> 
#include <string> 
#include <algorithm> 

int main() 
{ 
    std::string word; 

    std::cout << "Enter a word: "; 
    std::cin >> word; 

    std::reverse(word.begin(), word.end()); 

    std::cout << "Reverse: " << word << std::endl; 
    return 0; 
} 

準確瞭解是怎麼回事,有幾件事情,你必須覆蓋第一:

  • 數據結構(類)
  • 容器
  • 迭代

我希望你已經知道一個班級是什麼。如果你仍然在介紹性的東西,一個類基本上是用戶定義的狀態和行爲的集合。由於各種原因,作者可以選擇限制對課程的狀態或行爲的訪問。在std::string的情況下,標準庫字符串類,所有的狀態都是隱藏的,只有行爲可以訪問。

字符串類是一個包含字符的容器。還有很多其他的容器類,每個容器類都有不同的長處和短處。字符串類包含一個嚴格順序的字符序列。還有其他容器,如std::set,std::vector,std::list等。 std::stringstd::vector相似,並且是std::list的遠房親戚。每個集合的行爲都不同,適用於不同的事物。

您可能會認爲您需要了解字符串類如何存儲其數據才能將其反轉,但是您不知道。這是迭代器進來的地方。std::string擁有一個typedef,std::string::iterator,它是一個存儲單個元素在字符串中的位置的特殊對象。 std::reverse是一個庫函數,它需要2個迭代器並反覆交換其內容並將它們移向彼此。這看起來像這樣:

v v  <-- positions of iterators (start at the start, end at the end) 
ABC  <-- initial state 

v v  <-- the end iterator moved back 
ABC   

v v 
CBA  <-- the iterators swapped their values 

vv  <-- the begin iterator moved forward 
CBA   

V   <-- the end iterator moved back; both iterators are in the same place 
CBA  <-- therefore, we're done, the string is reversed 

關於迭代器的一件事是它們有點像指針。事實上,你可以傳遞指向一些期望迭代器的函數的指針,因爲它們在語法上相同。因此,您應該可以編寫自己的反向函數,它使用的指針基本上與此相同,除了char * s。

下面是一些僞代碼,你應該能夠編寫的函數(我不會寫出來完全是因爲它是家庭作業):

namespace BaidNation 
{ 
    void reverse(char *begin, char *end) 
    { 
     loop forever 
     { 
      if (end equals begin): 
       done; 
      move end backwards; 
      if (end equals begin): 
       done; 
      swap end's and begin's characters; 
      move begin forwards; 
     } 
    } 
} 

請記住,BaidNation::reverse(以及std::reverse)預計,用於結束引用元素的集合的末尾的的迭代器,而不是引用最後一個元素的元素。那麼如何使用它是有意義的?

您的LengthOfString函數返回字符串中非空字符的數量。由於數組是零索引的,我們知道像其他數組一樣,如果我們檢查string1 + LengthOfString(string1),我們會在結束之後得到一個指向該字符的指針,這正是我們想要的。

因此,我們可以用它來扭轉字符串:

int reverse(const char str[]) 
{ 
    char *start = str, *end = str + LengthOfString(str); 
    BaidNation::reverse(start, end); 
} 
+0

爲什麼人們不會說使用命名空間std; .....那麼多std :: s。 –

+0

我只打擾使用更長的片段的東西。 – Wug

+0

另外這顯然是一個家庭作業問題,所以我認爲他需要如何的實際細節。 –

2

爲主:

BaidNation::reverse(string1, string1 + LengthOfString(string1)); 

如果您有簽名前面正好使用,你可以這樣的設計改裝成另一種事實上你的原型函數的返回類型是int,它在我看來就像你想做一個字符串就地反轉。你首先需要知道字符串有多長(儘管你之前計算過,你沒有把結果傳遞給這個函數),然後交換元素,直到到達中間。爲了使這項工作,你需要傳遞,而不是一個const char[],而只是一個char*(表明您將要更換的內容):

int reverse(char* y) 
{ 
    int ii, n; 
    n = LengthOfString(y); // "no built in functions - otherwise, use strlen() 
    for(ii=0; ii<n/2;ii++) { 
    char temp; 
    temp = y[ii]; 
    y[ii] = y[n - ii - 1]; 
    y[n - ii] = temp; 
    } 
} 
+0

我無法使用任何內置函數。 n = strlen(y); – BaidNation

+0

所以使用你已經寫過的那個...'LengthOfString(y)' - 我已經相應地修改了我的答案。 – Floris

+0

快速問題,你可以在另一個函數中定義一個函數嗎? – BaidNation