2016-03-12 50 views
1

所以我目前正在做一個凱撒密碼程序使用ASCII代碼字母的原始文本將右移6個字符,但問題是當我輸入字母z,它返回Ç而不是返回字母f。這裏是我到目前爲止的代碼:凱撒密碼使用ASCII返回C-cedilla

void strEncrypt(string userin) 
{ 
    char wordArray[userin.length()]; 
    strcpy(wordArray, userin.c_str()); 

    for (int i=0; i<userin.size(); i++) 
    { 
     if(wordArray[i]>=65 && wordArray[i]<91) 
     { 
      wordArray[i] = wordArray[i] + 6; 
      if (wordArray[i]>90) 
      { 
       wordArray[i] = wordArray[i]-26; 
      } 
     } 
     else if(wordArray[i]>=97 && wordArray[i]<123) 
     { 
      wordArray[i] = wordArray[i] + 6; 
      while(wordArray[i]>=123) 
      { 
       wordArray[i] = wordArray[i]-26; 
      } 
     } 
    cout << wordArray[i]; 
    } 
} 

嘗試編譯並運行它,這樣你就會有我的問題是什麼更清晰的畫面

回答

2

你從符號整數溢出的痛苦!

很多這是執行相關/未定義的行爲,但放在一邊,我要解釋發生了什麼。

您的char類型已簽名,並保存從-128127的值。 'z'的值爲122。當您添加6時,它會變爲128 ...如果它能夠表示該號碼。但是,最大值是127,並且溢出。它環繞並變成-128

您可以在添加之前進行檢查,以確保角色的值足夠低,以便您可以安全地增加角色以避免此問題。


具體來說,char是否帶有符號依賴於實現,signed char只需要保存的值從-127127,並簽署溢出是未定義的行爲。

0

您已經溢出,使用無符號運算解決您的代碼:

unsigned char wordArray[userin.length()]; 
strcpy((char *) wordArray, userin.c_str());