c++各種輸入函數


1.scanf()函數

原型:int scanf(const char *restrict format,......);
入口參數:第一個參數是格式字符串,它指定了輸入的格式,......格式化后的字符串存取地址。
返回值:函數返回值為int類型,如果讀取到了“文件結束”則返回EOF,EOF為Ctrl+z或者Ctrl+d。其他情況則返回int型數字,例如:int res = scanf("%d %d",&a,&b);如果a,b都讀取成功,則返回2;如果a,b只讀取成功了一個,則返回1;如果a,b都沒有讀取成功,則返回0.
說明:scanf()函數是C語言庫中的函數,但由於C++的向下兼容性,所以在C++中也可以使用此函數。次函數是從標准輸入流stdio(一般是鍵盤輸入)中讀取數據,並將其按照指定格式輸入到制定地址。

scanf()函數遇到空格、換行和Tab鍵都會認為輸入結束(不讀取)。但是scanf("%c",&i)等價於i = getchar(),空格、tab和換行符都會被讀入。

頭文件:#include <stdio.h>
用例:

復制代碼
#include <stdio.h>
#include <iostream>
using namespace std;

int main()
{
    int a,b;
    scanf("%d %d",&a,&b); //注意此處輸入的格式,兩個輸入數字之間要以空格分隔開來。
    printf("%d %d",a,b);
}
復制代碼

---------------------------------------------------------------------

2.cin()類(此類命名空間都在std中,無需添加頭文件)。
2.1.cin>>函數
說明:當我們從鍵盤輸入時,有一個緩沖區,當輸入結束時會將所輸入的數據存到緩沖區。而cin>>的作用就是從緩沖區讀數據,所以當緩沖區數據本來就有殘留時,會出現讀取出錯的問題。值得一提的是:cin函數遇到空格、TAB、換行時讀取結束(不讀取)。
用例:
  輸入一個字符串。

復制代碼
  #include <iostream>
  using namespace std;
  void main ()
  {
    char a[10];
    cin>>a;
    cout<<a<<endl;
  }
復制代碼

  輸入:aaabbbccc
  輸出:aaabbbccc

  輸入:aaa bbb ccc
  輸出:aaa

---------------------------------------------------------------------

2.2.cin.get()函數
原型:該函數有三種形式,分別是char ch = cin.get(), cin.get(char ch), cin.get(array,length)。
    1.cin.get() 和 cin.get(char ch)的用法
    這兩個函數功能基本一樣,都是讀取緩沖區的一個字符,遇到換行符結束,這兩個函數會讀取空格、tab和換行符。char ch = cin.get(), cin.get(char ch)這兩句可得到相同的結果。

一般使用cin.get(ch),因其更符合對象方式,返回值是istream對象,這意味着可以講它們拼接起來:cin.get(ch1).get(ch2);


    用例:

復制代碼
   #include <iostream>
  using namespace std;
      void main()
     {
        char ch1,ch2;
        cin.get(ch1);
        ch2 = cin.get();

        cout<<ch1<<endl;
        cout<<ch2<<endl;
    }   
復制代碼

    輸入:a換行
    輸出:a
    
    (此處有一行空行,因為不會丟棄緩沖區里邊的空行)
---------------------------------------------------------------------
    2.cin.get(char* array, int length)
    這個函數是從緩沖區讀取字符串,其中array是字符串接受地址,length-1是字符串長度,因為最后一個字符必須存儲'\0'結束符,所以此函數只能接受length-1個字符。會讀取空格、tab和換行符,遇到換行符結束,並將換行符轉化為'\0',但是不會丟棄緩沖區里邊的換行符。
    用例:

復制代碼
    #include <iostream>
    using namespace std;
    void main()
    {
        char ch[5];
        cin.get(ch,5);
        cou<<ch<<endl;//可存入4個字符
     //char *ch2;
     //cin.get(ch2,12);//可存入11個字符
}
復制代碼

    輸入:abcdefghi
    輸出:abcd

---------------------------------------------------------------------
2.3.cin.getline(char* str,int length)函數
說明:接收一個長度為length-1的字符串,包括空格、tab和換行符,遇到換行符結束,並將換行符轉化為'\0'。與cin.get()類似。

復制代碼
   #include<iostream>
  using namespace std;
  int main()
  {
    char ch[10];
    cin.getline(ch,5);
    cout<<ch<<endl;
    return 0;
  }
復制代碼

  輸入:aaaaaaaa
  輸出:aaaa

cin.get和cin.getline的區別

分為三種情況來看:
1)輸入的字符串不超過限定大小
get(str,Size):讀du取所有zhi字符,遇到'\n'時止,並且將'\n'留在輸入緩沖區dao中,其將被下一個讀取輸入的操作捕獲,影響該輸入處理;
getline(str,Size):讀取所有字符,遇到'\n'時止,並且將'\n'直接從輸入緩沖區中刪除掉,不會影響下面的輸入處理。
2)輸入的字符數超出限定的大小
get(str,Size):讀取Size-1個字符,並將str[Size-1]置為'\0',然后將剩余字符(包括'\n')留在輸入緩沖區中,這些字符將被下一個讀取輸入的操作捕獲,影響該輸入處理;
getline(str,Size):讀取Size-1個字符,並將str[Size-1]置為'\0',剩余字符(包括'\n')留在輸入緩沖區中,隨即設置cin實效位(即if(!cin)的判斷為真),關閉輸入。其后的所有輸入都無法得到任何東西,當然也無法得到輸入緩沖區中剩余的字符串。但如果用clear()重置cin,其后的輸入便可用並會得到遺留在輸入緩沖區中的字符。
3)輸入一個空行(即直接回車)
get(str,Size):str將得到'\0',並設置cin實效位,關閉輸入,但回車依然留在輸入緩沖區中,因此如果我們用clear()重置cin,其下一個讀取輸入的操作將捕獲'\n';
getline(str,Size):str將得到'\0',並將'\n'刪除掉,不置實效位,不關閉輸入。所以對於cin.getline來說空行是合法的輸入,且不會影響下面的輸入處理。
至於使用那個更好,可能因人習慣不同而不同,仁者見仁智者見智。

---------------------------------------------------------------------
3.getline()函數

getline()和cin.getline()類似,但是cin.getline()屬於istream流,而getline()屬於string流,是不一樣的兩個函數。

原型:ssize_t getline(char **lineptr,size_t *n,FILE *stream);(在C語言的GCC擴展定義中)
      getline(cin,string s);(在C++中)
說明:getline不是C語言的庫函數,而是GCC的擴展定義或者C++庫函數,在C語言中和C++中的使用是不同的。

在C++中,應包含頭文件<string>,讀取字符串包含空格、tab和換行符,遇到換行符結束,並將換行符轉化為'\0'。
用例:

復制代碼
#include <iostream>
using namespace std;
int main()
{
    string s;
    getline(cin,s);
    cout<<s<<endl;

    return 0;
}
復制代碼

輸入:abcdefgh換行
輸出:abcdefgh

---------------------------------------------------------------------
4.gets()函數
原型:char *gets(char *buffer);
入口參數:從緩沖區讀取字符串后的寫入地址
返回值:讀取成功后返回與入口參數buffer相同的地址。讀取錯誤返回NULL。
頭文件:<string>
說明:接收輸入的字符串,沒有上限,但是要保證buffer足夠大,以換行結束,並將換行符轉化為'\0'。能讀取空格、tab與回車。
用例:

復制代碼
  #include<iostream>
  #include<string>
  using namespace std;
  int main()
  {
    char ch[10];
    gets(ch);
    cout<<ch<<endl;
    return 0;
  }
復制代碼

  輸入:abcdefg回車
  輸出:abcdefg
---------------------------------------------------------------------
5.getchar()函數
原型:int getchar(void);
返回值:讀取成功返回用戶輸入的ASCII碼,讀取失敗返回EOF.
頭文件:<string>或者<stdio.h>
說明:接收一個字符的輸入,包含空格、tab和換行,遇到換行符結束。

復制代碼
  #include<iostream>
  #include<string>
  using namespace std;
  int main()
  {
    char ch;
    ch = getchar();
    cout<<ch<<endl;
    return 0;
  }
復制代碼

  輸入:(空格)abc回車
  輸出:(空格)

---------------------------------------------------------------------

小結:

只能處理字符(char c):cin.get(c),c=cin.get(),c=getchar()。可讀取空格、tab和換行符,遇到換行符結束。

只能處理字符串(char* ch):cin.get(ch,length),cin.getline(ch,length),gets(ch)。能讀取空格、tab和換行符,遇到換行符結束,並將換行符轉化為'\0'。

只能處理string類型(string str):getline(cin, str)。能讀取空格、tab和換行符,遇到換行符結束,並將換行符轉化為'\0'。

能處理char和char*:scanf。scanf通常不能讀取空格和tab,只能在處理char字符時可以讀取空格、tab和換行符:scanf("%c",&ch),此時遇到換行符結束。

都能處理:cin,cin不可讀取空格、tab和換行符,遇到空格、tab和換行符結束。

 

若要讀取空格或者tab,對於char型用c=getchar(),char*型用gets(ch),string型用getline(cin, str)。

其中gets函數可能不被支持,易報錯,替換方案cin.get(ch,length)和cin.getline(ch,length)又需要指定長度,有時不方便,因此推薦使用char型和string型的解決方案。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM