2014-02-10 34 views
0

問題是:
編寫一個簡單的程序來使用查找表或簡單的算法來加密文本字符串;例如,文本字符串「Hello World」可以簡單地通過每個字符翻譯爲英文字母輸入「眼鏡蛇」輸出「dpcsb」翻譯1個字符到下一個C++

char inputwords[100]; 
char *words; 
char y='w'; 
int x=0; 

cout<<"Enter word: "; 
cin>>inputwords; 

words=&inputwords[0]; 


for(int ctr=0;ctr<100;ctr++) 
{ 
    if(*(words+ctr)+1==1||*(words+ctr)+1==-51) 
     cout<<" "; 
    else 
    cout<<char(*(words+ctr)+1); 
} 

這裏的下一個字母被加密爲字符串「ifmmp xpqme」是代碼片段 我的問題是,當我輸入「你好世界「的輸出只是」ifmmp「而忽視了」世界「。輸入流中的使用>>幫助:(

+1

'CTR <100','+ 1 == 1','-51' ......很多奇怪的事情。 –

+0

這個例子首先是不好的,因爲它不僅僅是「簡單地把每個字符翻譯成下一個字母」,它還改變了兩個字符的情況。 – twalberg

回答

2

cin只讀取第一個字而你的情況,這只是Hello跳過World。所以閱讀整個多詞串到char陣列inputwords使用,

cin.getline(inputwords, sizeof(inputwords)); 

for循環迭代100次,不管你的輸入字符串是什麼,這將導致字符串後的垃圾值。

你需要處理的情況下,如果有一個空間在兩個單詞之間做出放置保持不變,並不會導致!

0
  1. 使用getline而不是cin來獲取整行而不是第一個單詞。
  2. 迭代到字符串的末尾,不是任意的0.
  3. 與原始值比較,而不是+1值。不測試,如果當前1是1,測試,如果電流是0。

    char *itr = inputwords; 
    for (; *itr; ++itr) { 
        char curr = *itr; 
    } 
    
    1. 不要忘記處理 'Z' 和 'Z'
1

您正在編碼在C++中。使用std::string和STL算法代替舊式C數組和手工製作的循環。

#include <iostream> 
#include <string> 
#include <algorithm> 
using namespace std; 

int main() { 
    //encryption function, maths may be wrong. 
    auto f=[](char &x){x=(x+1)%255;}; 

    //decryption function, maths may be wrong too. 
    auto g=[](char &x){x=(x-1)%255;}; 

    std::string s; 
    std::getline(std::cin,s); 

    std::cout<<s<<std::endl; 
    std::for_each(std::begin(s),std::end(s),f); 
    std::cout<<s<<std::endl; 

    std::for_each(std::begin(s),std::end(s),g); 
    std::cout<<s<<std::endl; 
    return 0; 
} 

編輯:lambda所需的C++ 11,可以很容易地適應與C++ 03編譯器一起使用。

編輯2:看到它的行動有 - >http://ideone.com/SjeVaQ