2013-10-08 40 views
1

對不起,但我對C++很陌生,但一般情況下不能編程。所以我試圖做一個簡單的加密/解密。但是,當我將修改添加到我以前的代碼(因此沒有兩個程序用於加密和解密)時,我發現代碼'getline()'方法不再有效。相反,它只是在代碼運行時忽略它。下面的代碼:C++ getline方法不起作用

int main(){ 
    std::string string; 
    int op = 1; //Either Positive or Negative 

    srand(256); 
    std::cout << "Enter the operation: " << std::endl; 
    std::cin >> op; 
    std::cout << "Enter the string: " << std::endl; 
    std::getline(std::cin, string); //This is the like that's ignored 

    for(int i=0; i < string.length(); i++){ 
     string[i] += rand()*op; //If Positive will encrypt if negative then decrypt 
    } 
    std::cout << string << std::endl; 

    std::getchar(); //A Pause 
    return 0; 
} 
+0

我不知道哪個部分做解密......這不可能是RAND()*運算,可以嗎? –

+0

@owlstead是的,如果op是負數,那麼它會做與正輸入相反的結果。 – Jujunol

回答

7

這是因爲std::cin >> op;離開代碼中的掛\n,這是第一件事情getline讀取。由於getline一找到換行符就會停止讀取,該函數立即返回並且不再讀取任何內容。您需要忽略此字符,例如,使用cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');std::numeric_limits在標頭<limits>中定義),如cppreference中所述。

4

這是因爲你仍然有這使得getline()停止只要遇到它讀取緩衝區中的換行符。使用cin.ignore()忽略緩衝區中的換行符。這將在你的情況。

在一般情況下,如果你想從你的緩衝區中刪除字符,直到一個特定的字符,請使用:

cin.ignore (std::numeric_limits<std::streamsize>::max(), ch) 
3

用途:

cin.ignore (std::numeric_limits<std::streamsize>::max(), '\n');

從以前輸入std::cin >> op;

吃換行符

header - <limits>

其他的辦法是:

while (std::getline(std::cin, str)) //don't use string 
    if (str != "") 
    { 
     //Something good received 

     break; 
    } 
2

正如其他說明,格式化輸入(使用in >> value)開始時會跳過空格abd停止。通常這會導致留下一些空白。在格式化和未格式化輸入之間切換時,您通常希望擺脫領先空間。這樣做可以很容易地使用std::ws機械手來完成:

if (std::getline(std::cin >> std::ws, line)) { 
    ... 
}