首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

为什么小弟我的while循环从第二轮循环开始忽略了循环体的第一句话呢

2013-07-04 
为什么我的while循环从第二轮循环开始忽略了循环体的第一句话呢?本帖最后由 antonieo 于 2013-06-28 11:11

为什么我的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;
}

热点排行