轉自:https://www.cnblogs.com/zzw1024/p/10502011.html
常見的輸入問題:
1、直接用cin輸入(當然可以使用cout直接輸出):
1)string s;
cin >> s; //只接收回車鍵和空格前面所輸入的字符!!!!!
一旦輸入空格,cin將空格視為回車鍵,將會將后面的字符賦予后續有輸入cin函數的變量中,如下面的a,故一定確保輸入無空格!!
2)char a[10];
cin >> a; //同樣,只接收回車鍵和空格前面所輸入的字符!!!!!
一旦輸入空格,cin將空格視為回車鍵,將會將后面的字符賦予后續有輸入cin函數的變量中,如下面的a,故一定確保輸入無空格!!
同樣:(以下情況是一樣的)
char *b =a;
cin >> b;
2、使用空格為間隔輸入多個數字或字符(與scanf功能一樣)
1)int a,b,c;
cin >>a>>b>>c; //可以直接輸入a,b,c的值,中間用空格[n個也行]或者回車鍵間隔都可以!!!
2)
char a, b;
cin>>a>>b; //可以直接輸入a,b的值,中間用空格[n個也行]或者回車鍵間隔都可以!!!但無法將空格字符賦予a,b
輸入函數
string str/line;
1)cin
cin >> line
//遇到回車鍵停止輸入,按空格輸出,
空格、回車等會被丟棄(這些還在緩沖區中,下次若用cin會自動丟棄),下次又會讀取流中剩下的內容。(對於要輸入一個字符串如果用cin>>input;這樣的方法來輸入一個字符串,則遇到空白換行,制表之類的,輸入都會停止)因為從流中讀入數據保存到string中,string會遇到空格就停止錄入。這樣當我們輸入一行帶空格的字符串,就要考慮getline函數,從流中讀入一行字符串.
2)getline
string line;
getline(cin,line);//按回車鍵結束輸入
getline(cin,line,'#');
//輸入一串字符(不管多少個回車鍵),只要是在‘#’號之 前的字符都會讀取並保存
get與getline區別不是很大,但一個明顯的區別是get遇到'\n '字符后便返回,這時 '\n '還在緩沖區中,所以下次讀出來的將是 '\n ',而getline遇到'\n '也返回,但它會把 '\n '從緩沖區里移除掉,所以很多時候用getline方便些。
3)cin.get()
用法1: cin.get(字符變量名)可以用來接收字符
char ch;
ch = cin.get(); //只接受一個字符
用法2:cin.get(字符數組名,接收字符數目)用來接收一行字符串,可以接收空格
char a[20];
cin.get(a,20);
注意:
cin.get()會將回車鍵存儲在緩存中,若后面還有cin.get()函數,則該函數會將緩存中的回車鍵取出並賦予后面的輸入變量中,故,使用了cin.get()函數就一定后面要加getchar(),將回車鍵讀取並丟棄!!!!!!!!!
4)cin.getline()
//接受一個字符串可以接受空格並輸出
char m[20];
cin.getline(m,5);
輸入:jkjkjkjkkjkjkjkj
輸出:jklj //第5個字符默認添加'\0'
5)gets()【c++11已棄用!!!】
//接受一個字符,可以接受空格並輸出,需包含頭文件#include<string>
char ch;
gets(ch);
3)getchar()
getchar()是stdio.h中的庫函數,它的作用是從stdin流中讀入一個字符,也就是說,如果stdin有數據的話不用輸入它就可以直接讀取了,第一次getchar()時,確實需要人工的輸入,但是如果你輸了多個字符,以后的getchar()再執行時就會直接從緩沖區中讀取了。
故一般用getchar()來清除緩存中的字符;
4)輸入強行退出
Ctrl + Z 或輸入EOF再按回車鍵
讀入輸出掛
讀入輸出掛就是逐個字符地讀入數據,從而讓讀入更加快速。輸出掛的原理也是一樣的,都是通過將輸出數字變成輸出字符以加快速度。當然輸入輸出外掛一般用在大量輸入輸出的情況下,這樣性價比才高一些,否則得不償失。
void Rd(int &res){ res=0;char p; while(p=getchar(),p<'0'); do{ res=(res<<1)+(res<<3)+(p^48); }while(p=getchar(),p>='0'); }
void Rd(int &res){ res=0;char p;int k=1; while(p=getchar(),!(p>='0'&&p<='9')&&p!='-'); if(p=='-')k=-1,p=getchar(); do{ res=(res<<1)+(res<<3)+(p^48); }while(p=getchar(),(p>='0'&&p<='9')); res*=k; }
void Pt(int x){ if(x==0)return; Pt(x/10); putchar(x%10^48); }
void Ps(int x){ if(x<0)putchar('-'),x=-x; if(x==0)putchar('0'); else Pt(x); }