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型的解決方案。

