getline() 在代码中不起作用

getline() isn't working in code

本文关键字:不起作用 代码 getline      更新时间:2023-10-16

昨天我开始开发一种加密机,它的工作原理类似于凯撒密码。您输入一条消息(例如,HELLO),选择一个键值(例如,3),结果是 KHOOR(前向 3 个字母)。
问题是,如果我使用"cin>> msg;"我只能编纂一个词。如果我使用"getline (cin, msg);",代码不起作用。也许这是一个简单的问题,但我无法解决它... :(

string msg;
int a, b, i, key_value;
char c;
cout << "WRITE YOUR MESSAGE:" << endl;
cin >> msg;                         //HERE IS THE PROBLEM!!!
system ("cls");
cout << "PUT A KEY VALUE:" << endl;
cin >> key_value;
system ("cls");
cout << "THE CODIFIED MESSAGE IS:" << endl;
for (i=0; i < msg.length(); i++) {
    if (msg[i] == 'A') a = 1;
    if (msg[i] == 'B') a = 2;
    if (msg[i] == 'C') a = 3;
    if (msg[i] == 'D') a = 4;
    if (msg[i] == 'E') a = 5;
    if (msg[i] == 'F') a = 6;
    if (msg[i] == 'G') a = 7;
    if (msg[i] == 'H') a = 8;
    if (msg[i] == 'I') a = 9;
    if (msg[i] == 'J') a = 10;
    if (msg[i] == 'K') a = 11;
    if (msg[i] == 'L') a = 12;
    if (msg[i] == 'M') a = 13;
    if (msg[i] == 'N') a = 14;
    if (msg[i] == 'O') a = 15;
    if (msg[i] == 'P') a = 16;
    if (msg[i] == 'Q') a = 17;
    if (msg[i] == 'R') a = 18;
    if (msg[i] == 'S') a = 19;
    if (msg[i] == 'T') a = 20;
    if (msg[i] == 'U') a = 21;
    if (msg[i] == 'V') a = 22;
    if (msg[i] == 'W') a = 23;
    if (msg[i] == 'X') a = 24;
    if (msg[i] == 'Y') a = 25;
    if (msg[i] == 'Z') a = 26;
    b = a + key_value;
    if (b > 26) b -= 26;
    if (b == 1) c = 'A';
    if (b == 2) c = 'B';
    if (b == 3) c = 'C';
    if (b == 4) c = 'D';
    if (b == 5) c = 'E';
    if (b == 6) c = 'F';
    if (b == 7) c = 'G';
    if (b == 8) c = 'H';
    if (b == 9) c = 'I';
    if (b == 10) c = 'J';
    if (b == 11) c = 'K';
    if (b == 12) c = 'L';
    if (b == 13) c = 'M';
    if (b == 14) c = 'N';
    if (b == 15) c = 'O';
    if (b == 16) c = 'P';
    if (b == 17) c = 'Q';
    if (b == 18) c = 'R';
    if (b == 19) c = 'S';
    if (b == 20) c = 'T';
    if (b == 21) c = 'U';
    if (b == 22) c = 'V';
    if (b == 23) c = 'W';
    if (b == 24) c = 'X';
    if (b == 25) c = 'Y';
    if (b == 26) c = 'Z';
    cout << c;
}

所以你的代码工作正常: http://ideone.com/lBhD78

但是,如果您尝试接受超过 1 个单词,则简单的提取运算符将不起作用。这可能就是你要问的。在这种情况下,您将需要使用 getline .例如,像这样:

getline(cin, msg, 'n');

所以我不确定你在抱怨什么,但是这可以通过以下方式得到很大的改善:

  1. 不区分大小写
  2. 仅修改字母字符

您可以通过执行以下操作来实现此目的:

transform(cbegin(msg), cend(msg), ostream_iterator<char>(cout), [&](unsigned char i){
    if(isalpha(i)) {
        const auto a = islower(i) ? 'a' : 'A';
        i = (i - a + key_value) % 26 + a;
    }
    return i; });

我写了一个活生生的例子,里面有getline.

你必须

小心写问题。但是,在不清楚你的意思的情况下,答案是:

  • 默认情况下,当您读取 cin>>s 时,您正在考虑数据由"空格"分隔。因此,它会跳过空格并读取字符串,直到出现新的空格或输入结束。
  • 如果您在使用 getline 时遇到问题,则问题可能出在您显示的代码之前。例如,如果读取带有 cin>>integer 的值,则在输入末尾按换行键,但此字符仍在流中。如果你的代码中有以下行 es getline,你可能会读到一个空行。

在第一项中,您可以找到当前代码工作的原因,在第二项中,您可以找到为什么您的getline版本不起作用。