循环1次后cin.getline直接被跳过了,求高人解释~~
答案:1 悬赏:10 手机版
解决时间 2021-02-28 02:06
- 提问者网友:欺烟
- 2021-02-27 16:51
循环1次后cin.getline直接被跳过了,求高人解释~~
最佳答案
- 五星知识达人网友:深街酒徒
- 2021-02-27 17:25
我也不是十分清楚为啥第二次getline的哦时候会读入一个0,导致被跳过,改法倒是简单,如下:(函数结束处加上cin.ignore(); )
void fun()
{
//define variables
char *n; //nifix express
char *p; //postfix express
char temp[maxsize];
double result; //result
double parameter[para_num]; //values of parameters
int i=0,j=0;
int counter=0; //the number of variables
//to get n
cout<<"input a nifix express: ";
cin.getline(temp,maxsize);
n=new char[strlen(temp)+1];//这里最好+1,字符串需要为''保留一位空间
p=new char[strlen(temp)+1];//这里最好+1,字符串需要为''保留一位空间
strcpy(n,temp);
//to get counter
while(n[i]!='')
{
if(islower(n[i]))
{
counter++;
i++;
}
else
{
i++;
}
}
//to initialize variables
cout<<"input value of parameters: "< for(j=0;j {
cout<<"initializing "< cin>>parameter[j];
}
cin.ignore(); //加上这句就行
//run nifix_to_postfix
}追问貌似是那个for循环的原因:
for(j=0;j {
cout<<"initializing "< cin>>parameter[j];
}
这句之前是正常的。可是到底为什么呢,伤脑筋。。。追答不是啊,第二次进去fun(),cin.getline(temp,maxsize);的时候就不正常,获得的是'\0',我调试过的,第一次是完全正常的,
就是'\n'的影响,把cin.ignore();改为cin.ignore(1024, '\n');也可以,证明确实是'\n’的影响
下面是看到别人的解释,可以参考:
实际上你在每次输入数据的时候会输入一个回车 ‘\n'
cin在读入整数时候会忽略空白碰到非数字('\n')时停止
cin在getline时会把'\n'及之前的内容读回来,哪怕是空行也会读入
cin在读入字符时会把缓冲区内当前字符读入(不会忽略空白)
cin.ignore(1000, '\n')的含义是把缓冲区内从当前字符开始知道'\n'之前字符(如果有1000个的话)忽略掉,实际上你这里假设一行不会超过1000个字符,所以含义是忽略一行
如果你想输入a=1,b=2 name="xxxx", c='y'
所以你的输入是
1回车2回车xxxx回车y回车
cin读入a=1 碰到回车停止 此时1后面的回车还在缓冲区里
cin读b=2时忽略2前面的回车但是停止在2后面的回车
此时你如果掉getline 就会读入一个2后面回车前面的也就是空行 因此此时应当调用一个cin.ignore(1000,'\n')把这个\n忽略掉追问哦,原来是这样,我再好好理解一下。谢谢你的回答啊!追答从那个的说明可以看出,就是因为你for里面有cin>>parameter[j];
而你输入数字后,肯定会按回车吧,这个数字保存给了parameter,而回车就保存到缓存区了,
所以第二次getline获得回车符前面的东西(此时回车符前面已经没内容了),所以才读到空东西,相当于你啥都没输入就按了回车。
void fun()
{
//define variables
char *n; //nifix express
char *p; //postfix express
char temp[maxsize];
double result; //result
double parameter[para_num]; //values of parameters
int i=0,j=0;
int counter=0; //the number of variables
//to get n
cout<<"input a nifix express: ";
cin.getline(temp,maxsize);
n=new char[strlen(temp)+1];//这里最好+1,字符串需要为''保留一位空间
p=new char[strlen(temp)+1];//这里最好+1,字符串需要为''保留一位空间
strcpy(n,temp);
//to get counter
while(n[i]!='')
{
if(islower(n[i]))
{
counter++;
i++;
}
else
{
i++;
}
}
//to initialize variables
cout<<"input value of parameters: "<
cout<<"initializing "<
}
cin.ignore(); //加上这句就行
//run nifix_to_postfix
}追问貌似是那个for循环的原因:
for(j=0;j
cout<<"initializing "<
}
这句之前是正常的。可是到底为什么呢,伤脑筋。。。追答不是啊,第二次进去fun(),cin.getline(temp,maxsize);的时候就不正常,获得的是'\0',我调试过的,第一次是完全正常的,
就是'\n'的影响,把cin.ignore();改为cin.ignore(1024, '\n');也可以,证明确实是'\n’的影响
下面是看到别人的解释,可以参考:
实际上你在每次输入数据的时候会输入一个回车 ‘\n'
cin在读入整数时候会忽略空白碰到非数字('\n')时停止
cin在getline时会把'\n'及之前的内容读回来,哪怕是空行也会读入
cin在读入字符时会把缓冲区内当前字符读入(不会忽略空白)
cin.ignore(1000, '\n')的含义是把缓冲区内从当前字符开始知道'\n'之前字符(如果有1000个的话)忽略掉,实际上你这里假设一行不会超过1000个字符,所以含义是忽略一行
如果你想输入a=1,b=2 name="xxxx", c='y'
所以你的输入是
1回车2回车xxxx回车y回车
cin读入a=1 碰到回车停止 此时1后面的回车还在缓冲区里
cin读b=2时忽略2前面的回车但是停止在2后面的回车
此时你如果掉getline 就会读入一个2后面回车前面的也就是空行 因此此时应当调用一个cin.ignore(1000,'\n')把这个\n忽略掉追问哦,原来是这样,我再好好理解一下。谢谢你的回答啊!追答从那个的说明可以看出,就是因为你for里面有cin>>parameter[j];
而你输入数字后,肯定会按回车吧,这个数字保存给了parameter,而回车就保存到缓存区了,
所以第二次getline获得回车符前面的东西(此时回车符前面已经没内容了),所以才读到空东西,相当于你啥都没输入就按了回车。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯