2016-07-13 53 views
-2

昨天我開始開發一個加密機器,它的工作方式就像凱撒密碼。您輸入一條消息(例如HELLO),選擇一個鍵值(例如3),結果爲KHOOR(前進3個字母)。
問題是,如果我使用「cin >> msg;」我只能編一個字。如果我使用「getline(cin,msg);」,則代碼不起作用。也許這是一個簡單的問題,但我解決不了的... :(getline()不能在代碼中工作

string msg; 
int a, b, i, key_value; 
char c; 

cout << "WRITE YOUR MESSAGE:" << endl; 
cin >> msg;       //HERE IS THE PROBLEM!!! 

system ("cls"); 

cout << "PUT A KEY VALUE:" << endl; 
cin >> key_value; 

system ("cls"); 

cout << "THE CODIFIED MESSAGE IS:" << endl; 

for (i=0; i < msg.length(); i++) { 

    if (msg[i] == 'A') a = 1; 
    if (msg[i] == 'B') a = 2; 
    if (msg[i] == 'C') a = 3; 
    if (msg[i] == 'D') a = 4; 
    if (msg[i] == 'E') a = 5; 
    if (msg[i] == 'F') a = 6; 
    if (msg[i] == 'G') a = 7; 
    if (msg[i] == 'H') a = 8; 
    if (msg[i] == 'I') a = 9; 
    if (msg[i] == 'J') a = 10; 
    if (msg[i] == 'K') a = 11; 
    if (msg[i] == 'L') a = 12; 
    if (msg[i] == 'M') a = 13; 
    if (msg[i] == 'N') a = 14; 
    if (msg[i] == 'O') a = 15; 
    if (msg[i] == 'P') a = 16; 
    if (msg[i] == 'Q') a = 17; 
    if (msg[i] == 'R') a = 18; 
    if (msg[i] == 'S') a = 19; 
    if (msg[i] == 'T') a = 20; 
    if (msg[i] == 'U') a = 21; 
    if (msg[i] == 'V') a = 22; 
    if (msg[i] == 'W') a = 23; 
    if (msg[i] == 'X') a = 24; 
    if (msg[i] == 'Y') a = 25; 
    if (msg[i] == 'Z') a = 26; 

    b = a + key_value; 

    if (b > 26) b -= 26; 

    if (b == 1) c = 'A'; 
    if (b == 2) c = 'B'; 
    if (b == 3) c = 'C'; 
    if (b == 4) c = 'D'; 
    if (b == 5) c = 'E'; 
    if (b == 6) c = 'F'; 
    if (b == 7) c = 'G'; 
    if (b == 8) c = 'H'; 
    if (b == 9) c = 'I'; 
    if (b == 10) c = 'J'; 
    if (b == 11) c = 'K'; 
    if (b == 12) c = 'L'; 
    if (b == 13) c = 'M'; 
    if (b == 14) c = 'N'; 
    if (b == 15) c = 'O'; 
    if (b == 16) c = 'P'; 
    if (b == 17) c = 'Q'; 
    if (b == 18) c = 'R'; 
    if (b == 19) c = 'S'; 
    if (b == 20) c = 'T'; 
    if (b == 21) c = 'U'; 
    if (b == 22) c = 'V'; 
    if (b == 23) c = 'W'; 
    if (b == 24) c = 'X'; 
    if (b == 25) c = 'Y'; 
    if (b == 26) c = 'Z'; 

    cout << c; 

} 
+1

請發佈[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。可能重複(但投票的可能性太低)[C++ - 爲什麼std :: getline()在格式化提取後跳過輸入? - [Stack Overflow](http://stackoverflow.com/questions/21567291/why-does-stdgetline-skip-input-after-a-formatted-extraction) – MikeCAT

+7

請解釋*代碼不起作用*。 – lurker

+1

雖然這與您的問題無關(我同意@MikeCAT),但您處理將數字轉換爲字母表中字母的方式留下了許多不足之處,並使您的代碼非常有用討厭閱讀。看到這個問題的更好的策略:http://stackoverflow.com/questions/9259140/converting-numbers-into-alphabets-in-c – Jake

回答

1

所以,你的代碼工作正常:http://ideone.com/lBhD78

如果你想接受超過1個字的簡單提取運營商將不會例如然而工作,這是你問也許正是在這種情況下,你會希望使用getline就像這樣:。

getline(cin, msg, '\n'); 

所以我不能確定你在抱怨什麼,但是這可以通過以下方面得到很大改善:

  1. 作爲不區分大小寫的
  2. 只有修改字母字符

你可以通過做這樣的事情做到這一點:

transform(cbegin(msg), cend(msg), ostream_iterator<char>(cout), [&](unsigned char i){ 
    if(isalpha(i)) { 
     const auto a = islower(i) ? 'a' : 'A'; 

     i = (i - a + key_value) % 26 + a; 
    } 
    return i; }); 

我寫了一個Live Example完成getline

+1

...提供您的主機字符集按順序編碼字母字符(類似於ASCII碼的代碼; ECBDIC代碼不; C++不保證任何內容)。 –

+0

@TobySpeight確實沒有什麼可以保證'char'是ASCII或UTF-8,但是我想沒有什麼能保證字母表中有26個字符:/無論如何我已經修復了它, char'不會溢出。 (但我還沒有解決這個問題,畢竟它只是示例代碼。) –

0

你必須小心寫下問題。 ,但又不是清楚你的意思,答案是:

  • 當你閱讀CIN >>,默認情況下,你正在考慮的數據由「空格」分開。所以,它跳過空格並讀取字符串,直到輸入新空格或結束。
  • 如果您在使用getline時遇到問題,可能問題出在您顯示的代碼之前。如果你用例如cin >> integer讀取一個值,你可以在輸入結尾處按下換行符,但這個字符仍然在流中。如果代碼中的以下行代表getline,則可能會讀取空行。

在第一個項目中,您可以找到當前代碼的工作原理,在第二個項目中,爲什麼您的getline版本沒有。