1.cin和cout
cout是輸出流對象的名字,cin是輸入流對象的名字 ,“<<”是流插入運算符(也可稱流插入操作符〉,作用是將需要輸出的內容插入到輸出流中,默認的輸出設備是顯示器。 “>>”是流提取運算符,作用是從默認的輸入設備(一般為鍵盤〉的輸入流中提取若干字節送到計算機內存區中指定的變量。需要頭文件iostream
cout語句的一般格式為
cout<<表達式1<<表達式2<<...<<表達式n; cin>>變量1>>變量2>>...>>變量n;
執行cout語句時,並不是輸入-個數據馬上輸出一個數據,而是先把插入的數據順序在放在輸出緩沖區中.直到輸出緩沖區滿或遇到cout語句中的endl(或’\n’ ,endl)為止,此時將輸出緩沖區已有數據輸出並清空輸出緩沖區。
cin以空格、tab鍵地、換行做為數據問分隔符。接受一個字符串,遇“空格”、“TAB”、“回車”都結束
char c1,c2;int a;float b; cin>>c1>>c2>>a>>b;當輸入1234 56.78,則輸出1 2 34 56.78 系統會自動判別輸出類型。 int a=3;float b=4.21;char=’a’; cout<<a<<’ ’<<b<<’ ‘<<c<<endl; cin的返回值:當成功提取數據返回非0即true,當失敗或文件結束返回0。常用於while(cin>>a){} 關於cin和scanf,cout和printf的區別和特點請參考一本通中P37內容。前面已經學習了C語言又不是很熟悉cin用法的盡量使用scanf和printf,在處理string類型時使用cin 2.getline接受一個字符串,可以接收空格 cin.getline(字符數組(或字符指針),字符個數n,終止標志字符) char ch[20]; cin.getline(ch,20); //讀取19個字符或遇’\n’結束 cin.getline(ch,20,’\’); //讀取19個字符或遇’\’結束 string ch; //聲明字符串類型 getline(cin,ch); //接受一個string字符串,可以接收空格。讀取不限長度字符串到ch。注意上下兩種用法的不同
string類型和字符串數組的異同
string s; char str[10]; |
string |
字符串數組 |
定義具體長度 |
不需要 |
需要 |
s=”Hello!”; |
可直接賦值 |
不能,要用strcpy(str1,str2) |
以’\0’為結束符 |
只存放字符串本身,不包括’\0’ |
是 |
直接用==,>,<,>=,!=進行比較 |
可以 |
不可以,要用函數 |
存儲多組字符串 |
string s[3]={“jk”,”jkl”,”fds”}; |
str[3][20]={“jk”,”jkl”,”fds”}; |
1 #include<iostream> 2 //#include<string> //忘記了打也可以在windows的dev cpp通過 ,要考慮到考場上可能不行 3 #include<cstring> 4 using namespace std; 5 int main() 6 { 7 string str; 8 char c[20]; 9 cin>>str; 10 cin>>c; 11 if(str=="ok") //因str是string類型,可以直接使用=,==,<等 12 cout<<"yes"<<endl; 13 else cout<<"no"<<endl; 14 if(c=="ok") //這種寫法錯誤 ,因為c是字符數組,字符數組不是一等公民 15 //if(!strcmp(c,"ok")) 16 cout<<"yes"<<endl; 17 else cout<<"no"<<endl; 18 19 return 0; 20 } 21 /* 22 由於字符串的本質是數組,它也不是“一等公民”,只能用strcpy(a,b)、strcmp(a,b)、strcat(a,b)來 23 執行“賦值”、“比較”和“連接”操作。而不能用=、==、<=、+等運算符。上述函數都在string.h中聲明。 24 */
3.sprintf函數
sprintf是個變參函數,定義如下:
int sprintf( char *buffer, const char *format [, argument] ... );
此函數的功能是把格式化的數據寫入某個字符串,它的返回值是字符串長度。包含此函數的頭文件是stdio.h。
例如,本程序中的sprintf(buf,"%d%d%d%d%d",abc,de,x,y,z);語句的功能是將整數abcdexyx打印成字符串存儲在串buff中。
sprintf函數、printf函數、fprintf函數的區別:
printf輸出到屏幕,fprintf輸出到文件,而sprintf輸出到字符串。需要注意是應該保證寫入的字符串有足夠的空間。
4.sscanf函數
(1)sscanf()表示從一個字符串中讀取與指定格式相符的數據。它的函數原型如下:
int sscanf( const char *, const char *, …)
需要的頭文件是stdio.h。
(2)sscanf與scanf類似,都是用於輸入的,只是后者以鍵盤(stdin)為輸入源,前者以固定字符串為輸入源。
如果有一個格式為HH:MM:SS的字符串s(例如,"12:34:56"),用一條sscanf語句得到HH、MM、SS的值如下:
sscanf(s,"%d:%d:%",&HH,&MM,&SS);
將s替換成"12:34:56",可以得到HH的值為12,MM的值為34,SS的值為56。
C++中還有一種“字符串流”,可以實現類似sscanf和sprintf的功能:
1 #include <cstdio> 2 #include <sstream> 3 using namespace std; 4 #define MAXN 100010 5 int main() 6 { 7 char s[1000]; 8 cin.getline(s, 1000, '\n'); 9 stringstream ss(s); 10 int a, b; 11 ss >> a >> b; 12 count << a+b << "\n"; 13 return 0; 14 }
上面的函數先從cin讀取一行。Getline函數的第3個參數是行分隔符。它的默認值就是'\n',因此可以簡化為cin.getline(s,1000),其中1000的含義和fgets中的類似。
/*讀入兩個整數,中間用空格隔開,輸出他們的和*/
1 #include <cstdio> 2 #include <sstream> 3 #include <iostream> 4 #include<string> 5 using namespace std; 6 #define MAXN 100010 7 int main() 8 { 9 char s[1000]; 10 cin.getline(s,1000,'\n'); 11 //string s;getline(cin,s); //用這句功能類似 12 stringstream ss(s); 13 int a,b; 14 ss>>a>>b; //類似sscanf(s,"%d%d",&a,&b); 15 cout << a+b << "\n"; 16 return 0; 17 }
5.gets
gets用法gets(s),s是字符數組名,返回值是字符數組起始地址,可以不停往s中存內容不管能不能存下。
6.關於空格的輸入輸出
輸入字符: char ch; cin>>ch //只能輸入非空格非回車字符 scanf("%c",&ch);//可以輸入任意字符 ch = getchar();//可以輸入任意字符 輸出字符: cout<<ch;//輸出一個字符 printf("%c",ch);//輸出一個字符 putchar(ch);//輸出一個字符 輸入字符串: char buf[100]; cin>>buf;//輸入字符串,以空格、回車結束 gets(buf);//輸入一個字符串,可以包含空格,以回車結束,結尾加'\0' cin.getline(buf,100)//輸入一個字符串,可以包含空格,以回車結束,清除結束符 getline(cin,buf)//輸入一個字符串,可以包含空格,以回車結束,清除結束符 輸出: cout<<buf;//輸出字符串 canf("%s",buf);//輸出字符串 puts(buf);//向屏幕輸出字符串,並換行