Pointers 为什么我的程序第一次接受这些值,下一次运行时跳过我的第一个cin.getline()?

Pointers 为什么我的程序第一次接受这些值,下一次运行时跳过我的第一个cin.getline()?,pointers,function-pointers,Pointers,Function Pointers,嗨,伙计们,我是个新手,只是通过一个在线问题来做这件事。我的代码运行良好,符合要求。 我很好奇我做错了什么,让我的程序第一次运行良好,第二次运行不正常。。。第三,等等。请指教!!提前谢谢! 代码如下: void continueProg(char& cont) { cout << "Continue (Y/N)?: "; cin >> cont; if(cont=='y'||cont=='Y') { cont = '

嗨,伙计们,我是个新手,只是通过一个在线问题来做这件事。我的代码运行良好,符合要求。 我很好奇我做错了什么,让我的程序第一次运行良好,第二次运行不正常。。。第三,等等。请指教!!提前谢谢! 代码如下:

void continueProg(char& cont)
{
    cout << "Continue (Y/N)?: ";
    cin >> cont;
    if(cont=='y'||cont=='Y')
    {
        cont = 'Y';
    }
    else if((cont=='n')||(cont=='N'))
    {
        cont = 'n';
    }
    else
    {
        cout << "Please enter valid alaphelbet!\n";
        continueProg(cont);
    }
}
void continueProg(char&cont)
{
cout>cont;
如果(cont=='y'| | cont=='y')
{
cont='Y';
}
else if((cont=='n')| |(cont=='n'))
{
cont='n';
}
其他的
{
这是错误的:

UserEWord.W1=new char;
...
cin.getline(UserEWord.W1,'\n');
cin
的类型是
std::istream
,因此您实际调用的方法是

从文档中可以看到,第一个参数必须是指向(应该是什么)字符数组的指针,第二个参数
n
必须是允许方法写入的数组的大小(包括终止NUL)。可选的第三个参数是字符分隔符,顺便说一句,如果省略它,默认为换行符(
'\n'

您只使用一个字符分配了
W1
(和
W2
),这意味着缓冲区中只有一个字符的空间。您在调用
getline()
时将
'\n'
作为
n
传递,显然您希望将其作为分隔符。但最终结果是字符值(10)将作为缓冲区的大小,太大。任何非空输入都会使缓冲区溢出,导致未定义的行为

这里还有第二个问题,这就是你确切问题的答案:

void continueProg(char& cont)
{
    cout << "Continue (Y/N)?: ";
    cin >> cont;
    if(cont=='y'||cont=='Y')
<> > >编辑:对您的注释,不,您不能这样做。<代码> STD::String 类型是C++标准库提供的容器类,是完全不同于语言的原生代码“char < /Calp>/Cuth>Car */Cuff> >类型。您通常不能直接使用另一个。(尽管应该提到的是,在参数中需要
std::string
const std::string&
时,始终可以传递
const char*
char*
,但只有ap>会调用隐式函数将
const char*
char*
转换为
const std::string&
,但只有ap>使用IN参数,而不是OUT参数,正如我们在这里使用的
std::getline()
,它接受一个非常量
std::string&
)(还应该提到的是,如果您有
std::string
,const与否,您可以调用该方法以获得指向内容的
const char*

如果您真的想使用
char
s数组,那么要解决第一个问题,您必须执行以下操作:

#define MAX 100
...
UserEWord.W1=new char [MAX]; // allocate an array of MAX chars
...
cin.getline(UserEWord.W1,MAX);
要解决第二个问题,您可以使用
cin.ignore();
,正如以赛亚所建议的:

void continueProg(char& cont)
{
    cout << "Continue (Y/N)?: ";
    cin >> cont;
    cin.ignore(numeric_limits<streamsize>::max(),'\n'); // requires #include <limits>
    if(cont=='y'||cont=='Y')
void continueProg(char&cont)
{
cout>cont;
cin.ignore(数值限制::max(),'\n');//需要包含
如果(cont=='y'| | cont=='y')

cin.ignore
15 charscin.clear();cin.ignore(100,“\n”);抱歉,但我可以问一下,如果我不包括它,为什么它会出错?如果你不包括它,那么当一个人提前键入/不正确的数据时,该数据会留在缓冲区中,然后由下一个cin.getline函数读取。如果你在C中工作,当涉及到C的scanf时,你会知道我的意思
void continueProg(char& cont)
{
    cout << "Continue (Y/N)?: ";
    cin >> cont;
    cin.ignore(numeric_limits<streamsize>::max(),'\n'); // requires #include <limits>
    if(cont=='y'||cont=='Y')