天天看點

關于cin、cin.get()和cin.getline()函數的使用方法詳解,超詳細!!!!

此文章是我在自己寫代碼時,每次結合使用不同的輸入方法時,老是遇到各種奇奇怪怪的問題,得不到自己想要的輸出結果,查閱了各種資料之後,總結如下:

cin

的讀取字元規則:

cin

遇到回車、空格、tab鍵 結束,但是緩沖區還存在這三個字元,并沒有将這三個字元丢棄,且指針光标在這三個字元之前,也就是說,下一次通過其他輸入函數讀取時,是可以讀到這三個字元的。

cin.get

的讀取字元規則:

  1. 讀取字元:
以Enter鍵結束,并且會将Enter鍵作為一個字元讀入,讀完Enter鍵之後,指針光标移到Enter鍵後面,如果後面還有輸入的話,會讀取下一字元。故下圖不會像後面讀取字元串一樣介紹的不跳過Enter鍵
int main()
{


    int len=0;
    cin>>len;

    int j=0;
//    cin.ignore();
    while(len)
    {
        cout<<"len:"<<len<<endl;
        char str[100];

        cin.get(str[j]);
//        cin.ignore();

        cout<<"str:"<<int(str[j])<<'\t';
        j++;
        len--;
    }
    return 0;
}
           
關于cin、cin.get()和cin.getline()函數的使用方法詳解,超詳細!!!!
如下所示,使用

cin.ignore

将回車符丢棄,程式便能夠正常運作。
關于cin、cin.get()和cin.getline()函數的使用方法詳解,超詳細!!!!
  1. 讀取字元串:
以Enter鍵結束,讀取到前面殘留的回車會直接結束,并且指針光标不會跳過Enter鍵,當輸入

3【回車】

之後,再次使用

cin.get

,然後想輸入

4【回車】

是讀取不到該輸入值的

但是你不用輸入,程式會直接結束,因為前一個輸入的回車并沒有舍棄,而是在緩沖區,這時讀取到的是緩沖區的回車而直接結束。

以下是不使用

cin.ignore

丢棄緩沖區的字元的結果:

指針光标不跳過Enter鍵:注釋掉

cin.ignore

之後,可以看到程式隻輸入

5【回車】

,就直接結束了,而且輸入了5個空串,後面的輸入語句看似沒有執行,其實執行了,讀取的是緩沖區中遺留下的Enter鍵,并且

cin.get

函數遇到回車不會将指針光标移到回車後,故造成了讀到的一直是回車,是以結束

cin.getline

cin.get

函數類似,所不同的是,

cin.getline

遇到回車會将指針光标後移,具體看後面

cin.getline

的貼圖。

cin.ignore

的作用預設是丢棄緩沖區的一個字元)。
我們可以看到

cin>>len

之後,回車了,而且後面也有

cin.get

要求輸入,但是程式卻直接自動執行結束,說明讀取字元串時,指針光标不會跳過Enter鍵,除非人為添加

cin.ignore()

或者

getchar()

讀走Enter鍵,程式才能正常運作.
int main()
{


    int len=0;
    cin>>len;

    int j=0;
//    cin.ignore();
    while(len)
    {
        cout<<"len:"<<len<<endl;
        char str[100];

        cin.get(str,100);
//        cin.ignore();

        cout<<"str:"<<str<<'\t';
        j++;
        len--;
    }
    return 0;
}
           
關于cin、cin.get()和cin.getline()函數的使用方法詳解,超詳細!!!!
如下所示,使用

cin.ignore

将回車符丢棄,程式便能夠正常運作。
關于cin、cin.get()和cin.getline()函數的使用方法詳解,超詳細!!!!

cin.getline

的讀取字元規則:

  1. 讀取字元串:Enter鍵結束
當讀到Enter鍵的時候,此次讀取結束,會将指針光标移到Enter鍵之後,進而下一次讀取的是Enter鍵之後的字元。
int main()
{


    int len=0;
    cin>>len;

    int j=0;
    cin.ignore();
    while(len)
    {
        cout<<"len:"<<len<<endl;
        char str[100];

        cin.getline(str,100);
//        cin.ignore();

        cout<<"str:"<<str<<'\t';
        j++;
        len--;
    }
    return 0;
}
           
當我們輸入

2【回車】

後,使用

cin.ignore

丢棄了回車符,是以再輸入

12【回車】

時,直接讀取12,指針光标移到回車之後,而第二次讀取時,讀取的是我們輸入的23,而不是12的Enter鍵。
關于cin、cin.get()和cin.getline()函數的使用方法詳解,超詳細!!!!
如果我們注釋掉第一個

cin.ignore

之後,可以看到,我們輸入

2【回車】

後,

len

讀取了2,然後

cin.getline

遇到前面緩沖區留下的Enter鍵,結束此次讀取操作,并将指針光标移動至回車之後,然後執行下一次讀取操作,我們輸入23,可以看到第二次讀取到了23這個字元串。
關于cin、cin.get()和cin.getline()函數的使用方法詳解,超詳細!!!!

繼續閱讀