为什么第二个'cin>>'不会被处理?

时间:2014-03-26 15:18:59

标签: c++ api cryptography iostream cin

我是C ++的新手,我去年学过Java,并且在本学期我必须立即学习使用C ++和MFC / API的加密编程,现在很多人都很困惑,无论如何,请看一下代码:

#include <iostream>
#include <string>

using namespace std;

#define strSize 100

int main()
{
    char message[strSize];
    char cipher[strSize];
    char plaintext[strSize];
    int nCount;
    char nEKey, nDKey;

    for(int i=0; i<strSize; ++i)
    {
        message[i] = '\0';
        cipher[i] = '\0';
        plaintext[i] = '\0';
    }

    cout << "Please enter your confidential message:" << endl;
    cin.getline(message, strSize);
    nCount = cin.gcount();
    cout << nCount << " characters read." << endl;

    cout << "Enter secret key:" << endl;
    cin >> nEKey;
    for(int j=0; j<nCount-1; ++j)
        cipher[j] = message[j] + nEKey;
    cout << "Message is encrypted into:" << endl << cipher << endl << endl;

    cout << "Type your secret key again:" << endl;
    cin >> nDKey;

    for (int k=0; k<nCount-1; ++k)
        plaintext[k] = cipher[k] - nDKey;
    cout << "Cipher text is decrypted to:" << endl << plaintext << endl;

    return 0;
}

运行已编译的程序时,结果为:

Please enter your confidential message:
hello world
12 characters read.
Enter secret key:
abc
Message is encrypted into:
袴?望答

Type your secret key again:
Cipher text is decrypted to:
gdkknvnqkc

我用g ++编译了它,在visual studio中,它们产生了相同的输出。

现在我的问题是:为什么第二个cin不会被处理?

在视觉工作室,它给了我一个警告说:

...\enc.cpp(25): warning C4244: '=' : conversion from 'std::streamsize' to 'int', possible loss of data

OMD,我是新手,只是不知道它的意思,有人可以帮忙解决它吗?

非常感谢!

4 个答案:

答案 0 :(得分:1)

nEKeynDKey都是char类型,这意味着它们只能存储一个char。

cin >> nEKey只读a abc,后来cin >> nDKey读取b,这是输入中的下一个字符。

答案 1 :(得分:1)

cin >> nEKey; // nEKey = 'a'

将单个字符读取到nEKey。输入的其余部分留在流中。下次阅读下一个字符时,请阅读:

//...
cin >> nDKey; // nDKey = 'b'

阅读单个字符后,您应该忽略其余的输入。考虑使用std::string将所有输入读入字符串。

警告

warning '=':conversion from 'std::streamsize' to 'int',possible loss of data

是将较大的std::streamsize打包到int时可能会丢失数据造成的。使用std::streamsize

std::streamsize nCount = cin.gcount(); 

答案 2 :(得分:1)

cin >> nEKey;读取字符'a'而不是字符串“abc”。然后,cin >> nDKey;读取下一个字符(即'b')。

答案 3 :(得分:0)

对于编译器的警告,请尝试将cin.gcount()转换为int,就像这样。

 nCount = (int)cin.gcount();

您应该确定字符串的大小可以包含在signed int中。