2012-02-27 27 views
0

我正在爲C++練習ROT13。然而這段代碼在這裏返回一個錯誤並且不能編譯,我不明白爲什麼!我在以下行中發佈了一段代碼:strchr不能使用字符[]

string encode(string &x) 
{ 
    char alphabet[] = "abcdefghijklmnopqrstuvwxyz"; 

    for (size_t l=0;l<x.size();++l){ 
     cout<<x[l]; 
     cout<< strchr(alphabet,x[l]);  
    } 
    return x; 
} 

Q2。還幫助我返回字母表[]中匹配字母的索引(例如,5代表'f'),我可以將其添加到13並將其附加到x等。

Q3。除了練習,CS中的哪個課程將幫助我開發更高效的算法?是計算理論,離散數學還是算法?

+2

嘿,什麼是ptr? – nullpotent 2012-02-27 12:54:46

+1

如果編譯失敗,你的編譯器錯誤/消息是什麼? – Zeta 2012-02-27 12:56:14

+0

你能發佈編譯器錯誤嗎?此外,使用'ptr',但_never_未初始化。 – hmjd 2012-02-27 12:59:22

回答

2

爲了,從問題1:

以下編譯對我罰款:

#include <iostream> 
#include <cstring> 

std::string encode(std::string &x) 
{ 
    char alphabet[] = "abcdefghijklmnopqrstuvwxyz"; 
    char *ptr; 
    for (size_t l=0;l<x.size();++l){ 
     std::cout<<x[l]; 
     std::cout<< std::strchr(alphabet,x[l]); 
    } 
    return x; 
} 

int main (int argc, char* argv []) { 
    return 0; 
} 

確保:

  • 你可以列舉出了頭,用於coutstrchr
  • 使用std::前綴,除非您使用std命名空間。
  • 修復ptr問題。

問題2:

如果你正在尋找一個方便的ROT-13的方法,可以考慮使用兩個C字符串,一個用於來源,一個用於翻譯:

char from[] = "abcdefghijklmnopqrstuvwxyz"; 
char to [] = "nopqrstuvwxyzabcdefghijklm"; 

然後,您可以使用strchr在第一個中查找並使用該指針在第二個中查找等價物。

char src = 'j'; 
char *p = strchr (from, src); 
if (p == NULL) 
    std::cout << src; 
else 
    std::cout << to[p - from]; 

那倒原樣輸出,如果它沒有被發現或查找翻譯,如果它被發現的字符。你也可能想把大寫字母放在那裏。

問題3:

如果您想了解高效的算法,我會去的,令人驚訝的是,一個算法當然:-)計算

理論聽起來有點幹,但它可能很好地涵蓋算法背後的理論基礎。離散數學對算法具有適用性,但同樣可能非常理論化。這些都是基於這些詞的意思,當然,所涵蓋的實際學科領域可能完全不同,所以您應該接受提供課程的人的意見。

額外位:

如果你正在尋找的東西到你自己的工作比較,這裏有一個我放在一起基於我以上建議:

#include <iostream> 
#include <cstring> 

std::string rot13 (std::string x) 
{ 
    char from[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
    char to [] = "nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM"; 
    std::string retstr = ""; 
    for (size_t i = 0; i < x.size(); ++i) { 
     char *p = std::strchr (from, x[i]); 
     if (p == 0) 
      retstr += x[i]; 
     else 
      retstr += to[p - from]; 
    } 
    return retstr; 
} 

int main (int argc, char* argv []) { 
    std::string one = "This string contains 47 and 53."; 
    std::string two = rot13 (one); 
    std::string three = rot13 (two); 
    std::cout << one << '\n'; 
    std::cout << two << '\n'; 
    std::cout << three << '\n'; 
    return 0; 
} 

返回的建築字符串可能已經被更有效地完成了(例如一個新的字符數組,它只在最後成爲一個字符串),但它很好地說明了該方法的「查找」部分。

輸出是:

This string contains 47 and 53. 
Guvf fgevat pbagnvaf 47 naq 53. 
This string contains 47 and 53. 

,你可以驗證here,如果需要的話。

+2

考慮到你已經有兩個數組,每個都有52個'char',爲什麼不一路走來,只用一個數組,並將原始字符轉換爲'unsigned char'? – 2012-02-27 14:26:40

+0

是的,那是另一種方式。你必須允許非ASCII字符集和CHAR_BIT> 8的可移植性,但它幾乎肯定會更快。 – paxdiablo 2012-02-28 01:14:00

+0

最大的區別在於表格「編碼」源中的編碼;一個不同的編碼(比如EBCDIC),你必須修改源代碼。字符串查找將其留給編譯器。 (對於ROT-13,我懷疑你不必擔心其他編碼,但在一般情況下......) – 2012-02-28 08:24:59

0

鑄造alphabetconst char*,它應該事後工作。請記住type[]type *不同。

+1

'type []'可以隱式轉換爲'type *'(和'type *'爲'const type *')。不應該有任何需要演員。 – 2012-02-27 13:16:17