我正在使用此程序来实现Mono字母密码。我得到的问题是当我输入纯文本时,当按下回车键满足条件时它不会离开循环。这是我的代码。
int main()
{
system("cls");
cout << "Enter the plain text you want to encrypt";
k = 0;
while(1)
{
ch = getche();
if(ch == '\n')
{
break; // here is the problem program not getting out of the loop
}
for(i = 0; i < 26; i++)
{
if(arr[i] == ch)
{
ch = key[i];
}
}
string[k] = ch;
k++;
}
for(i = 0;i < k; i++)
{
cout << string[i];
}
getch();
return 0;
}
答案 0 :(得分:3)
这里的问题可能是getche()
(与getchar()
不同)只返回第一个字符,当有多个输入时,你就在窗口上(否则你不会使用{{ 1}})然后EOL用cls
编码。
\r\n
返回getche()
会发生什么,所以你的休息时间永远不会被执行。您应该将其更改为\r
,即使因为getche是非标准函数。
您甚至可以在您的情况下尝试查找getchar()
而不是\r
,但我想如果您需要稍后获取任何其他输入,\n
将保留在缓冲区中会导致问题(不确定)。
答案 1 :(得分:2)
依赖于C ++中的旧C库是令人讨厌的。考虑这个替代方案:
#include <iostream>
#include <string>
using namespace std; // haters gonna hate
char transform(char c) // replace with whatever you have
{
if (c >= 'a' && c <= 'z') return ((c - 'a') + 13) % 26 + 'a';
else if (c >= 'A' && c <= 'Z') return ((c - 'A') + 13) % 26 + 'A';
else return c;
}
int main()
{
// system("cls"); // ideone doesn't like cls because it isnt windows
string outstring = "";
char ch;
cout << "Enter the plain text you want to encrypt: ";
while(1)
{
cin >> noskipws >> ch;
if(ch == '\n' || !cin) break;
cout << (int) ch << " ";
outstring.append(1, transform(ch));
}
cout << outstring << endl;
cin >> ch;
return 0;
}
答案 2 :(得分:2)
我会做类似以下使用标准C ++ I / O的事情。
#include <iostream>
#include <string>
using namespace std;
// you will need to fill out this table.
char arr[] = {'Z', 'Y', 'X'};
char key[] = {'A', 'B', 'C'};
int main(int argc, _TCHAR* argv[])
{
string sInput;
char sOutput[128];
int k;
cout << "\n\nEnter the plain text you want to encrypt\n";
cin >> sInput;
for (k = 0; k < sInput.length(); k++) {
char ch = sInput[k];
for(int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++)
{
if(arr[i] == ch)
{
ch = key[i];
break;
}
}
sOutput[k] = ch;
}
sOutput[k] = 0;
cout << sOutput;
cout << "\n\nPause. Enter junk and press Enter to complete.\n";
cin >> sOutput[0];
return 0;
}