愷撒密碼(cin和getline連用出現問題),cingetline
題目描述
愷撒生活在充滿危險和陰謀的時代. 愷撒面對的最困難的問題是生存. 為了生存, 他決定創造一種密碼. 這種密碼聽起來難以置信, 如果不知 道方法, 沒有人可以破解.
你是愷撒軍隊的一個上尉. 你的工作是解密訊息並將之提供給將軍. 密碼很簡單. 對明文的每個字母右移5個位置以建立密文 (如字母’A’, 密 文是’F’).
有如下對應:
密文
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
明文
V W X Y Z A B C D E F G H I J K L M N O P Q R S T U
只有字母需要移位, 其它字元保持不變, 所有字母均是大寫.
輸入
輸入為至多100組資料. 每組資料有如下格式, 中間無空行. 一組資料有3部分:
起始行 - 單獨一行: “START”
密文 - 單獨一行, 包含1到200個字元, 組成愷撒的訊息.
結束行 - 單獨一行: “END”
最後一組輸入是單獨一行: “ENDOFINPUT”.
輸出
對每組資料有一行輸出. 即愷撒的原始訊息.
範例輸入
START
NS BFW, JAJSYX TK NRUTWYFSHJ FWJ YMJ WJXZQY TK YWNANFQ HFZXJX
END
START
N BTZQI WFYMJW GJ KNWXY NS F QNYYQJ NGJWNFS ANQQFLJ YMFS XJHTSI NS WTRJ
END
START
IFSLJW PSTBX KZQQ BJQQ YMFY HFJXFW NX RTWJ IFSLJWTZX YMFS MJ
END
ENDOFINPUT
範例輸出
IN WAR, EVENTS OF IMPORTANCE ARE THE RESULT OF TRIVIAL CAUSES
I WOULD RATHER BE FIRST IN A LITTLE IBERIAN VILLAGE THAN SECOND IN ROME
DANGER KNOWS FULL WELL THAT CAESAR IS MORE DANGEROUS THAN HE
#include <iostream>#include <string>using namespace std;int main(){ string start,str,end; while(cin>>start&&start=="START") { cin.ignore();//看注釋 getline(cin,str); cin>>end; for (int i=0;i<str.size();i++) { if (str[i]>='A'&&str[i]<='Z') { str[i]=((str[i]-'A')+26-5)%26+'A'; } } cout<<str<<endl; } return 0;}
getline(cin,str)的讀取原理是將以‘/n’為結束符做為一完整讀取的一行,’/n’會讀。所以當之前用cin讀取一個字元的時候,你會輸入一個字元然後點擊斷行符號,那麼下面getline(cin,str)讀的時候會讀入這個斷行符號,並判斷結束了。
解決的方法是在getline前面加入cin.ignore().這個就會忽略那個斷行符號。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。 http://blog.csdn.net/qq_36667170/article/details/79089477