2016-07-15 44 views
-3

,所以我試圖用凱撒密碼與char *的,我寫了一個簡單的函數出來是這樣的:使用char *的凱撒密碼? C++

char * Encrypt(char * s, int k) 
{ 
    char * c = s; 

    for(int i = 0; i < strlen(s); i++) 
     c[i] += k; 

    return c; 
} 

,這似乎看起來像它應該工作,但事實並非如此。運行程序時會引發錯誤。

這裏是我如何調用該函數的一個例子:「爲什麼不直接使用string

int main() 
{ 
    cout << Encrypt("hello", 2) << endl; 
    system("pause"); 
    return 0; 
} 

和你說之前,那麼答案是我在某SDK使編寫C++使用string時出現編譯錯誤。好的,但是,任何形式的幫助將不勝感激,謝謝!

+0

如果你不是(或不能)使用'std :: string',那麼你應該使用正確的C庫函數*將Source的內容複製到適當大小的數組中。否則,你正在修改'Source'。 – crashmstr

+0

請記住,char無符號短小,如果您的密鑰超出char範圍以外的值,則加密可能無效。 –

+2

讓我猜,你用字符串文字調用這個函數?請嘗試創建[最小化,完整和可驗證示例](http://stackoverflow.com/help/mcve)並向我們顯示。特別是你如何調用這個函數。 –

回答

6

"Hello"這樣的字符串文字是只讀。如果您嘗試修改這樣的字符串,您將有未定義的行爲

在C++中字符串文字實際上是常量個字符的數組。

使用char*來訪問字符串文字應該讓你的編譯器在你尖叫一個警告。如果不是,則需要調高警戒級別或啓用更多警告。

如果你真的用C++編程,我建議你學習std::stringfind a good beginners book來閱讀。

+0

這是問題的修改。一個好的編譯器/執行系統只會在只讀存儲器中使用常量字符串。 – zaph