输入“cobra”输出“dpcsb”将1个字符转换为下一个c ++

时间:2014-02-10 15:04:22

标签: c++ algorithm lookup-tables

问题是:
编写一个简单的程序,使用查找表或简单算法加密文本字符串;例如,只需将每个字符翻译成字母表的下一个字母,就可以将文本字符串“Hello World”加密为字符串“ifmmp xpqme”

  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);
}

这是代码片段 我的问题是,当我输入“Hello World”时,输出只是“ifmmp”并且它忽略了“World”。帮助:(

3 个答案:

答案 0 :(得分:2)

在输入流上使用cin

>>只会读取第一个单词,在您的情况下,Hello只会World跳过char。所以要将整个多字词串读入inputwords数组cin.getline(inputwords, sizeof(inputwords)); 使用,

for

100循环迭代!次,无论您的输入字符串是什么,这将导致字符串后面的垃圾值。

你需要处理案例,例如,如果两个单词之间有空格,则make put保持不变,而不是将其推进到{{1}}。

答案 1 :(得分: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:在那里看到它 - &gt; http://ideone.com/SjeVaQ

答案 2 :(得分:0)

  1. 使用getline而不是cin来获取整行而不是第一个单词。
  2. 迭代直到字符串的结尾,而不是任意的0。
  3. 与原始值进行比较,而不是+1值。不要测试当前+1是否为1,测试当前是否为0。

    char *itr = inputwords;
    for ( ; *itr; ++itr ) {
        char curr = *itr;
    }
    
    1. 别忘了处理'z'和'Z'