读书人

为什么小弟我的while循环从第二轮循环

发布时间: 2013-07-04 11:45:28 作者: rapoo

为什么我的while循环从第二轮循环开始忽略了循环体的第一句话呢?
本帖最后由 antonieo 于 2013-06-28 11:11:42 编辑 本人最近正在入门C++,所以这可能是一个很低级的错误,先上我的代码再说问题:


#include <iostream>
#include <string>
using namespace std;

void PrintBigger(string inputLine)
{
if (inputLine != "")
{
cout<<"The bigger string is: "<<inputLine<<endl;
}
}

void PrintLonger(string inputLine)
{
if (inputLine != "")
{
cout<<"The longer string is: "<<inputLine<<endl;
}
}

string GetBiggerString(string in_line1, string in_line2)
{
string biggerString;
if (in_line1 == in_line2)
{
cout<<"Same string."<<endl;
biggerString = "";
}
else if (in_line1 > in_line2)
{
biggerString = in_line1;
}
else
{
biggerString = in_line2;
}
return biggerString;
}

string GetLongerString(string in_line1, string in_line2)
{
string longerString;
if (in_line1.size() == in_line2.size())
{
cout<<"Same length"<<endl;
longerString = "";
}
else if (in_line1.size() > in_line2.size())
{
longerString = in_line1;
}
else
{
longerString = in_line2;
}
return longerString;
}

int main()
{
string line1,line2;
cout<<endl<<"input a line of strings: "<<endl;


while(getline(cin, line1))
{
cout<<"input another line of strings"<<endl;
getline(cin, line2);

cout<<endl<<"Line1 is: "<<line1<<endl<<"Line2 is: "<<line2<<endl;
cout<<endl<<"Get bigger or longer one?[input B/L]"<<endl;
string modeChoise;
while(cin>>modeChoise)
{
if (modeChoise =="B")
{
string biggerString;
biggerString = GetBiggerString(line1, line2);
PrintBigger(biggerString);
break;
}

else if (modeChoise == "L")
{
string longerString;
longerString = GetLongerString(line1,line2);
PrintLonger(longerString);
break;
}
else
{
cout<<"please input B or L"<<endl;
}
}
cout<<endl<<"input a line of strings:"<<endl;


}
return 0;
}



这个程序是想让用户输入两行字符串,然后可以通过输入B或L来比较两行字符串的大小或长度,在比较完之后输出结果,然后继续循环,继续让用户输入两行字符串,再进行比较,知道用户输入Ctrl + z停止输入为止。

但程序的交互输出结果如下:

input a line of strings:
line1(这是我输入的部分)
input another line of strings
line2(这是我输入的部分)

Line1 is: line1
Line2 is: line2

Get bigger or longer one?[input B/L]
L(这是我输入的部分)
Same length

input a line of strings:
input another line of strings(问题就在这里,程序没有等我输入,直接继续运行后面的代码了)
line3(这是我输入的部分)

Line1 is:
Line2 is: line3(由于第一行没有让我输入,line1变量的字符串内容变成了空字符串)

Get bigger or longer one?[input B/L]
...
现在的情况是,第一遍循环的执行是正常的,但是在进行了比较之后,进入第二轮字符串输入时,却会自动把line1也就是第一行字符串变量的输入跳过,或者说直接赋值为空字符串,直接让我输入line2,那么这里面究竟是哪里出了问题呢?
如果我希望程序再新一轮循环中,让我重新输入line1的内容,该怎么改代码呢?
C++ String while cin
[解决办法]
while(cin>>modeChoise)
不会把你输入的字符后的空格从输入缓冲区中去除,结果下一次getline时遇到的第一个字符就是换行。
解决方法:

while(cin>>modeChoise)
{
cin.ignore(0x99999, '\n');//跳过换行符



[解决办法]


#include <iostream>
#include <string>
using namespace std;

void PrintBigger(string inputLine)
{
if (inputLine != "")
{
cout<<"The bigger string is: "<<inputLine<<endl;
}
}

void PrintLonger(string inputLine)
{
if (inputLine != "")


{
cout<<"The longer string is: "<<inputLine<<endl;
}
}

string GetBiggerString(string in_line1, string in_line2)
{
string biggerString;
if (in_line1 == in_line2)
{
cout<<"Same string."<<endl;
biggerString = "";
}
else if (in_line1 > in_line2)
{
biggerString = in_line1;
}
else
{
biggerString = in_line2;
}
return biggerString;
}

string GetLongerString(string in_line1, string in_line2)
{
string longerString;
if (in_line1.size() == in_line2.size())
{
cout<<"Same length"<<endl;
longerString = "";
}
else if (in_line1.size() > in_line2.size())
{
longerString = in_line1;
}
else
{
longerString = in_line2;
}
return longerString;
}

int main()
{
string line1,line2;
cout<<endl<<"input a line of strings: "<<endl;
while(getline(cin, line1))
{
cout<<"input another line of strings"<<endl;
getline(cin, line2);

cout<<endl<<"Line1 is: "<<line1<<endl<<"Line2 is: "<<line2<<endl;
cout<<endl<<"Get bigger or longer one?[input B/L]"<<endl;
string modeChoise;


while(cin>>modeChoise)
{
char ch;
cin.get(ch);//把换行符读掉。。
if (modeChoise =="B")
{
string biggerString;
biggerString = GetBiggerString(line1, line2);
PrintBigger(biggerString);
break;
}

else if (modeChoise == "L")
{
string longerString;
longerString = GetLongerString(line1,line2);
PrintLonger(longerString);
break;
}
else
{
cout<<"please input B or L"<<endl;
}
}
cout<<endl<<"input a line of strings:"<<endl;
}
return 0;
}

读书人网 >C++

热点推荐