2012-09-19 63 views
0

我正在使用這個程序來實現單聲道字母密碼。我得到的問題是,當我輸入純文本時,它不會退出循環,當條件滿足時,按下回車鍵。這裏是我的代碼。沒有走出循環

int main() 
{ 
    system("cls"); 
    cout << "Enter the plain text you want to encrypt"; 
    k = 0; 
    while(1) 
    { 
     ch = getche(); 
     if(ch == '\n') 
     { 

      break; // here is the problem program not getting out of the loop 
     } 
     for(i = 0; i < 26; i++) 
     { 
      if(arr[i] == ch) 
      { 
       ch = key[i]; 
      } 
     } 
     string[k] = ch; 
     k++; 
    } 
    for(i = 0;i < k; i++) 
    { 
     cout << string[i]; 
    } 
    getch(); 
    return 0; 
} 
+0

休息是否受到打擊?如果不是,getche是否捕獲換行符? – devshorts

+0

@devshorts這就是它沒有獲得換行符的問題。 – james

+0

有沒有機會在Widnows機器上發生這個問題? – monksy

回答

3

這裏的問題可能是,getche()(不像getchar())剛剛返回時,有一個以上inputed和你使用的是Windows(othewise你不會使用cls)的第一個字符的事實則是EOL編碼爲\r\n

會發生什麼事是getche()返回\r所以你的休息是從來沒有實際執行。即使因爲getche是一個非標準函數,您應該將其更改爲getchar()

你甚至可以嘗試尋找\r,而不是在您的情況\n但是我想\n將繼續留在緩衝區造成問題,如果以後需要獲取任何額外的輸入(不知道它)。

+0

不應該在'\ r'之後得到'\ n'嗎? –

+0

它應該用'getchar',它實際上並不用'getche'來做。 – Jack

+0

啊,你剛剛打敗了我。 'getche'顯然是'conio.h'的一部分,這是一些老派的MSDOS代碼,因此不應該再使用。 – Rook

2

依靠C++中的舊C庫很可惜。考慮這個替代方案:

#include <iostream> 
#include <string> 

using namespace std; // haters gonna hate 

char transform(char c) // replace with whatever you have 
{ 
    if (c >= 'a' && c <= 'z') return ((c - 'a') + 13) % 26 + 'a'; 
    else if (c >= 'A' && c <= 'Z') return ((c - 'A') + 13) % 26 + 'A'; 
    else return c; 
} 

int main() 
{ 
    // system("cls"); // ideone doesn't like cls because it isnt windows 
    string outstring = ""; 
    char ch; 
    cout << "Enter the plain text you want to encrypt: "; 
    while(1) 
    { 
     cin >> noskipws >> ch; 
     if(ch == '\n' || !cin) break; 
     cout << (int) ch << " "; 
     outstring.append(1, transform(ch)); 
    } 
    cout << outstring << endl; 
    cin >> ch; 
    return 0; 
} 
2

我會做類似使用標準C++ I/O的休閒方式。

#include <iostream> 
#include <string> 

using namespace std; 

// you will need to fill out this table. 
char arr[] = {'Z', 'Y', 'X'}; 
char key[] = {'A', 'B', 'C'}; 

int main(int argc, _TCHAR* argv[]) 
{ 
    string sInput; 
    char sOutput[128]; 
    int k; 

    cout << "\n\nEnter the plain text you want to encrypt\n"; 
    cin >> sInput; 

    for (k = 0; k < sInput.length(); k++) { 
     char ch = sInput[k]; 

     for(int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++) 
     { 
      if(arr[i] == ch) 
      { 
       ch = key[i]; 
       break; 
      } 
     } 
     sOutput[k] = ch; 
    } 
    sOutput[k] = 0; 
    cout << sOutput; 

    cout << "\n\nPause. Enter junk and press Enter to complete.\n"; 
    cin >> sOutput[0]; 

    return 0; 
}