c++必須要會的stl標準模板庫

Vector
vector 基本操作
vector v;
v.begin(); //容器的起始位置
v.end(); //容器最後一個位置後的位置
v.front();v.back(); //返回第一個元素(最後一個元素,但不判斷時候存在
v.empty(); //返回是否容器爲空
v.clear(); //清空容器
v.erase(m); //刪除m位置的數據,並返回下一個數據的地址(m是迭代器)
v.erase(m,n); //刪除m到n之間的數據,並返回下一個數據的地址
v2.assign(8,1); // 重新給vec2賦值,8個成員的初始值都爲1
v.push_back(element); //壓入一個元素到末端
v.pop_back(); //彈出最後一個元素
v.reserve(100);v.resize(101); //resize已經創建空間如果再v.push_back();空間就會到101,而reserve只是預留空間並沒有真正創建,v.push_back();只是在第1位
v.size();v.capacity(); //size表示的是已經創建的空間大小也可以表示元素個數可用v[]的形式直接訪問,capacity容器容量,是預留空間並沒有實際創建
swap(a,b); //交換兩個元素的位置如:swap(v[0],v[1]);
vector v(10); //創建一個前十個元素爲int的容器
vector v(10,string(“I”)); //使容器的前10個元素都爲string型,並且都初始化爲I
vector v1(v2); //對於已經存在的v2創建一個v1副本
v.insert(place,element);
v.insert(place,n,element); //在place(迭代器)位插入n個元素
//注:對vector元素的訪問可以用類似c語言的v[],但是最好用v.at(),它會檢查是否越界更安全
v[0]; // A
v.at[0]; // B 這樣越界的時候比較安全
vector 遍歷
vector 有兩種遍歷方法
一種是使用迭代器
vector ::iterator it;
for(it = v.begin(); it!=v.end(); it++)
{
cout<<(*it)<<endl;
}
還有就是直接用下標的方式訪問
v[0]; // A
v.at[0]; // B 這樣越界的時候比較安全
deque雙端隊列
容器類與vector類似,支持隨機訪問和快速插入刪除,它在容器中某一位置上的操作所花費的是線性時間。與vector不同的是,deque還支持從開始端插入數據:push_front()。此外deque也不支持與vector的capacity()、reserve()類似的操作。
#include
deque deq;//初始化對象爲空
deque deq1(10,6);//對象初始化有10個值爲6的元素
deque :: iterator it;
for(it = deq.begin(); it!=deq.end(); it++){
cout<<*it<<endl;
}
deq.push_back(ele);//從隊列尾部插入
deq.push_front(ele);//從隊列頭部插入
deq.insert(deq.begin()+1,3,9);//從隊列中間插入三個9
//和vector一樣,雙向隊列也可以用下標的形式訪問,也可以用at
deq.at(n);//返回的是n這個下標的值
//也可以直接deq[n]

deq1.at(1)=10;
deq1[2]=12;
//從deq1序列的前後各移去一個元素
deq1.pop_front();
deq1.pop_back();

deq.erase(deq.begin()+1);//清除deq的第二個元素

//對deq2賦值並顯示
deq2.assign(8,1);
cout<<“deq2.assign(8,1):”<<endl;
put_deque(deq2,“deq2”);
//erase(),assign()是大多數容器都有的操作

集合set(特點是沒有重複元素且元素時有序的)
注:set是STL中一種標準關聯容器(vector,list,string,deque都是序列容器,而set,multiset,map,multimap是標準關聯容器),它底層使用平衡的搜索樹——紅黑樹實現,插入刪除操作時僅僅需要指針操作節點即可完成,不涉及到內存移動和拷貝,所以效率比較高。set,顧名思義是“集合”的意思,在set中元素都是唯一的,而且默認情況下會對元素自動進行升序排列,支持集合的交(set_intersection),差(set_difference) 並(set_union),對稱差(set_symmetric_difference) 等一些集合上的操作,如果需要集合中的元素允許重複那麼可以使用multiset
關於set,必須說明的是set關聯式容器。set作爲一個容器也是用來存儲同一數據類型的數據類型,並且能從一個數據集合中取出數據,在set中每個元素的值都唯一,而且系統能根據元素的值自動進行排序。默認的是從小到大的排序
應該注意的是set中數元素的值不能直接被改變。
C++ STL中標準關聯容器set, multiset, map, multimap內部採用的就是一種非常高效的平衡檢索二叉樹:紅黑樹,也成爲RB樹(Red-Black Tree)。RB樹的統計性能要好於一般平衡二叉樹,所以被STL選擇作爲了關聯容器的內部結構。
set 基本操作 遍歷 及其對應算法
set s;
s.insert(element);//插入元素
//遍歷整個幾何(不重複的有序序列)
set:: iterator it;
for(it = s.begin(); it!=s.end(); it++){
cout<<(*it)<<endl;
}
s.size();//返回元素個數
s.find(ele);//返回元素的下標,沒找到的話返回s.end();
//獲得兩個set的並
set s1;
set s2;
set s3;//存結果
set_union(s1.begin(),s1.end(),s2.begin(),s2.end(),insert_iterator<set >(s3,s3.begin()));
//輸出也可以用下面的形式
copy(s3.begin(),s3.end(),ostream_iterator(cout," “));
cout<<endl;
//獲得兩個set的交,注意進行集合操作之前接收結果的set要調用clear()函數清空一下
s3.clear();
set_intersection(s1.begin(),s1.end(),s2.begin(),s2.end(),insert_iterator<set >(s3.s3.begin()));
copy(s3.begin(),s3.end(),ostream_iterator(cout,” "));
cout<<endl;

//獲得兩個set的差
s3.clear();
set_difference(s1.begin(),s1.end(),s2.begin(),s2.end(),insert_iterator<set >(s3,s3.begin()));
cout<<“Difference:”;
copy(s3.begin(),s3.end(),ostream_iterator(cout," “));
cout<<endl;
//獲得兩個set的對稱差,也就是假設兩個集合分別爲A和B那麼對稱差爲AUB-A∩B
eg3.clear();
set_symmetric_difference(s1.begin(),s1.end(),s2.begin(),s2.end(),insert_iterator<set >(s3,s3.begin()));
copy(s3.begin(),s3.end(),ostream_iterator(cout,” "));
cout<<endl;

map 和 Multimap映射
可對數據進行快速高效檢索,而且map支持通過下標直接訪問及map[“string”]=4
這種形式,可以實現兩個值得對應,常見的定義形式有map<string,int>mapstring;
map的基本操作
#include

map<int, string> mym;
//三種插入方法
mym.insert(pair<int,string>(120,“haha”));
mym.insert(map<int,string>::value_type(312,“gaga”));
mym[120] = “haha”;
//find()函數返回一個迭代器指向鍵值爲key的元素,如果沒找到就返回指向map尾部的迭代器。
map<int ,string >::iterator l_it;
l_it=maplive.find(112);//返回的是一個指針
if(l_it==maplive.end())
cout<<“we do not find112”<<endl;
else
cout<<“wo find112”<<endl;

//也可以用這種方式來查找
map<int ,string> m;
m[1] = “haa”;
m[44] = “xixi”;
if(m[12]=="") puts(“NO”);

//刪除一個元素
map<int,string> m;
map<int,string>::iterator it;
it = m.find(112);
if(it == m.end()){ exit;}
else m.erase(it);
//類似的也可以通過賦值爲空來將一個元素刪除

//Map中的swap不是一個容器中的元素交換,而是兩個容器交換

begin() //返回指向map頭部的迭代器
clear()// 刪除所有元素
count()// 返回指定元素出現的次數
empty() //如果map爲空則返回true
end() //返回指向map末尾的迭代器
equal_range()// 返回特殊條目的迭代器對
erase() //刪除一個元素
find() //查找一個元素
insert() //插入元素
lower_bound() //返回鍵值>=給定元素的第一個位置
max_size() //返回可以容納的最大元素個數
rbegin() //返回一個指向map尾部的逆向迭代器
rend() //返回一個指向map頭部的逆向迭代器
size() //返回map中元素的個數
swap()// 交換兩個map
upper_bound()// 返回鍵值>給定元素的第一個位置
value_comp() //返回比較元素value的函數
multimap基本用法:
這裏一定要注意的是multimap
//multimap允許重複的鍵值插入容器
// **********************************************************
// * pair只包含一對數值:pair<int,char> *
// * map是一個集合類型,永遠保持排好序的, *
// pair * map每一個成員就是一個pair,例如:map<int,char> *
// * map的insert()可以把一個pair對象作爲map的參數,例如map

*
// ***********************************************************
#pragma warning(disable:4786)
#include
#include
using namespace std;

int main(void)
{
multimap<int,char*> m;
//multimap的插入只能用insert()不能用數組
m.insert(pair<int,char*>(1,“apple”));
m.insert(pair<int,char*>(1,“pear”));//apple和pear的價錢完全有可能是一樣的
m.insert(pair<int,char*>(2,“banana”));
//multimap的遍歷只能用迭代器方式不能用數組
cout<<"**************************************"<<endl;
multimap<int,char
>::iterator i,iend;
iend=m.end();
for(i=m.begin();i!=iend;i++)
{
cout<<(i).second<<“的價錢是”
<<(i).first<<“元/斤\n”;
}
cout<<"
************************************"<<endl;
//元素的反相遍歷
multimap<int,char
>::reverse_iterator j,jend;
jend=m.rend();
for(j=m.rbegin();j!=jend;j++)
{
cout<<(j).second<<“的價錢是”
<<(j).first<<“元/斤\n”;
}
cout<<"
************************************"<<endl;
//元素的搜索find(),pair<iterator,iterator>equal_range(const key_type &k)const
//和multiset的用法一樣
multimap<int,char
>::iterator s;
s=m.find(1);//find()只要找到一個就行了,然後立即返回。
cout<<(s).second<<" "
<<(s).first<<endl;
cout<<“鍵值等於1的元素個數是:”<<m.count(1)<<endl;
cout<<"
*************************************"<<endl;
//刪除 erase(),clear()
m.erase(1);
for(i=m.begin();i!=iend;i++)
{
cout<<(*i).second<<“的價錢是”
<<(*i).first<<“元/斤\n”;
}
return 0;
}

queue與priority_queue
元素先進先出,只能充隊列末端插入和刪除元素
隊列基本操作
#include
queue q1;
q.push(x);//將元素插入到隊列末尾
q.pop();//彈出隊列的第一個元素(隊首),並不會返回元素的值
q.front();//訪問隊首的元素
q.back();//訪問隊尾元素
q.size();//返回隊列中元素的個數
在頭文件中,還定義了一個非常有用的模版類priority_queue(優先隊列),優先隊列與隊列的差別在於優先隊列不是按照入隊的順序出隊,而是按照隊列中元素的優先權順序出隊(默認爲大者優先,也可以通過指定算子來指定自己的優先順序)。

stack 棧
棧是後進先出的容器,操作和queue很像
stack 基本操作

#include
stack s;
s.push();//壓棧
s.pop();//出棧
s.top();//獲取棧頂元素
s.empty();
s.size();
s.end();
s.begin();

algorithm
非修改性序列操作(12個)
循環 對序列中的每個元素執行某操作 for_each()
查找 在序列中找出某個值的第一次出現的位置 find()
在序列中找出符合某謂詞的第一個元素 find_if()
在序列中找出一子序列的最後一次出現的位置 find_end()
在序列中找出第一次出現指定值集中之值的位置 find_first_of()
在序列中找出相鄰的一對值 adjacent_find()
計數 在序列中統計某個值出現的次數 count()
在序列中統計與某謂詞匹配的次數 count_if()
比較 找出兩個序列相異的第一個元素 mismatch()
兩個序列中的對應元素都相同時爲真 equal()
搜索 在序列中找出一子序列的第一次出現的位置 search()
在序列中找出一值的連續n次出現的位置 search_n()
修改性序列操作(27個)
複製 從序列的第一個元素起進行復制 copy()
從序列的最後一個元素起進行復制 copy_backward()
交換 交換兩個元素 swap()
交換指定範圍的元素 swap_ranges()
交換由迭代器所指的兩個元素 iter_swap()
變換 將某操作應用於指定範圍的每個元素 transform()
替換 用一個給定值替換一些值 replace()
替換滿足謂詞的一些元素 replace_if()
複製序列時用一給定值替換元素 replace_copy()
複製序列時替換滿足謂詞的元素 replace_copy_if()
填充 用一給定值取代所有元素 fill()
用一給定值取代前n個元素 fill_n()
生成 用一操作的結果取代所有元素 generate()
用一操作的結果取代前n個元素 generate_n()
刪除 刪除具有給定值的元素 remove()
刪除滿足謂詞的元素 remove_if()
複製序列時刪除具有給定值的元素 remove_copy()
複製序列時刪除滿足謂詞的元素 remove_copy_if()
唯一 刪除相鄰的重複元素 unique()
複製序列時刪除相鄰的重複元素 unique_copy()
反轉 反轉元素的次序 reverse()
複製序列時反轉元素的次序 reverse_copy()
環移 循環移動元素 rotate()
複製序列時循環移動元素 rotate_copy()
隨機 採用均勻分佈來隨機移動元素 random_shuffle()
劃分 將滿足某謂詞的元素都放到前面 partition()
將滿足某謂詞的元素都放到前面並維持原順序 stable_partition()
序列排序及相關操作(27個)
排序 以很好的平均效率排序 sort()
排序,並維持相同元素的原有順序 stable_sort()
將序列的前一部分排好序 partial_sort()
複製的同時將序列的前一部分排好序 partial_sort_copy()
第n個元素 將第n各元素放到它的正確位置 nth_element()
二分檢索 找到大於等於某值的第一次出現 lower_bound()
找到大於某值的第一次出現 upper_bound()
找到(在不破壞順序的前提下)可插入給定值的最大範圍 equal_range()
在有序序列中確定給定元素是否存在 binary_search()
歸併 歸併兩個有序序列 merge()
歸併兩個接續的有序序列 inplace_merge()
有序結構上的集合操作 一序列爲另一序列的子序列時爲真 includes()
構造兩個集合的有序並集 set_union()
構造兩個集合的有序交集 set_intersection()
構造兩個集合的有序差集 set_difference()
構造兩個集合的有序對稱差集(並-交) set_symmetric_difference()
堆操作 向堆中加入元素 push_heap()
從堆中彈出元素 pop_heap()
從序列構造堆 make_heap()
給堆排序 sort_heap()
最大和最小 兩個值中較小的 min()
兩個值中較大的 max()
序列中的最小元素 min_element()
序列中的最大元素 max_element()
詞典比較 兩個序列按字典序的第一個在前 lexicographical_compare()
排列生成器 按字典序的下一個排列 next_permutation()
按字典序的前一個排列 prev_permutation()

非修改性序列操作(12個)
循環 對序列中的每個元素執行某操作 for_each()
查找 在序列中找出某個值的第一次出現的位置 find()
在序列中找出符合某謂詞的第一個元素 find_if()
在序列中找出一子序列的最後一次出現的位置 find_end()
在序列中找出第一次出現指定值集中之值的位置 find_first_of()
在序列中找出相鄰的一對值 adjacent_find()
計數 在序列中統計某個值出現的次數 count()
在序列中統計與某謂詞匹配的次數 count_if()
比較 找出兩個序列相異的第一個元素 mismatch()
兩個序列中的對應元素都相同時爲真 equal()
搜索 在序列中找出一子序列的第一次出現的位置 search()
在序列中找出一值的連續n次出現的位置 search_n()
修改性序列操作(27個)
複製 從序列的第一個元素起進行復制 copy()
從序列的最後一個元素起進行復制 copy_backward()
交換 交換兩個元素 swap()
交換指定範圍的元素 swap_ranges()
交換由迭代器所指的兩個元素 iter_swap()
變換 將某操作應用於指定範圍的每個元素 transform()
替換 用一個給定值替換一些值 replace()
替換滿足謂詞的一些元素 replace_if()
複製序列時用一給定值替換元素 replace_copy()
複製序列時替換滿足謂詞的元素 replace_copy_if()
填充 用一給定值取代所有元素 fill()
用一給定值取代前n個元素 fill_n()
生成 用一操作的結果取代所有元素 generate()
用一操作的結果取代前n個元素 generate_n()
刪除 刪除具有給定值的元素 remove()
刪除滿足謂詞的元素 remove_if()
複製序列時刪除具有給定值的元素 remove_copy()
複製序列時刪除滿足謂詞的元素 remove_copy_if()
唯一 刪除相鄰的重複元素 unique()
複製序列時刪除相鄰的重複元素 unique_copy()
反轉 反轉元素的次序 reverse()
複製序列時反轉元素的次序 reverse_copy()
環移 循環移動元素 rotate()
複製序列時循環移動元素 rotate_copy()
隨機 採用均勻分佈來隨機移動元素 random_shuffle()
劃分 將滿足某謂詞的元素都放到前面 partition()
將滿足某謂詞的元素都放到前面並維持原順序 stable_partition()
序列排序及相關操作(27個)
排序 以很好的平均效率排序 sort()
排序,並維持相同元素的原有順序 stable_sort()
將序列的前一部分排好序 partial_sort()
複製的同時將序列的前一部分排好序 partial_sort_copy()
第n個元素 將第n各元素放到它的正確位置 nth_element()
二分檢索 找到大於等於某值的第一次出現 lower_bound()
找到大於某值的第一次出現 upper_bound()
找到(在不破壞順序的前提下)可插入給定值的最大範圍 equal_range()
在有序序列中確定給定元素是否存在 binary_search()
歸併 歸併兩個有序序列 merge()
歸併兩個接續的有序序列 inplace_merge()
有序結構上的集合操作 一序列爲另一序列的子序列時爲真 includes()
構造兩個集合的有序並集 set_union()
構造兩個集合的有序交集 set_intersection()
構造兩個集合的有序差集 set_difference()
構造兩個集合的有序對稱差集(並-交) set_symmetric_difference()
堆操作 向堆中加入元素 push_heap()
從堆中彈出元素 pop_heap()
從序列構造堆 make_heap()
給堆排序 sort_heap()
最大和最小 兩個值中較小的 min()
兩個值中較大的 max()
序列中的最小元素 min_element()
序列中的最大元素 max_element()
詞典比較 兩個序列按字典序的第一個在前 lexicographical_compare()
排列生成器 按字典序的下一個排列 next_permutation()
按字典序的前一個排列 prev_permutation()

Cmath
int abs(int i);//返回整型參數i的絕對值
double fabs(double x);//返回雙精度參數x的絕對值
long labs(long n);//返回長整型參數n的絕對值

double exp(double x);//返回指數函數e^x的值
double log(double x);//返回logex的值
double log10(double x) 返回log10x的值
double pow(double x,double y) 返回x^y的值
double pow10(int p) 返回10^p的值

double sqrt(double x) 返回+√x的值

double acos(double x) 返回x的反餘弦arccos(x)值,x爲弧度
double asin(double x) 返回x的反正弦arcsin(x)值,x爲弧度
double atan(double x) 返回x的反正切arctan(x)值,x爲弧度
double cos(double x) 返回x的餘弦cos(x)值,x爲弧度
double sin(double x) 返回x的正弦sin(x)值,x爲弧度
double tan(double x) 返回x的正切tan(x)值,x爲弧度

double hypot(double x,double y) 返回直角三角形斜邊的長度(z),
x和y爲直角邊的長度,z2=x2+y^2

double ceil(double x) 返回不小於x的最小整數
double floor(double x) 返回不大於x的最大整數

int rand() 產生一個隨機數並返回這個數

double atof(char *nptr) 將字符串nptr轉換成浮點數並返回這個浮點數
double atol(char *nptr) 將字符串nptr轉換成長整數並返回這個整數
double atof(char *nptr) 將字符串nptr轉換成雙精度數,並返回這個數,錯誤返回0
int atoi(char *nptr) 將字符串nptr轉換成整型數, 並返回這個數,錯誤返回0
long atol(char *nptr) 將字符串nptr轉換成長整型數,並返回這個數,錯誤返回0

string
1.聲明一個C++字符串
a) string s; //生成一個空字符串s
b) string s(str) //拷貝構造函數 生成str的複製品
c) string s(str,stridx) //將字符串str內"始於位置stridx"的部分當作字符串的初值
d) string s(str,stridx,strlen) //將字符串str內"始於stridx且長度頂多strlen"的部分作爲字符串的初值
e) string s(cstr) //將C字符串作爲s的初值
f) string s(chars,chars_len) //將C字符串前chars_len個字符作爲字符串s的初值。
g) string s(num,c) //生成一個字符串,包含num個c字符
h) string s(beg,end) //以區間beg;end(不包含end)內的字符作爲字符串s的初值
i) s.~string() //銷燬所有字符,釋放內存
2.字符串操作函數
a) =,assign() //賦以新值
b) swap() //交換兩個字符串的內容
c) +=,append(),push_back() //在尾部添加字符
d) insert() //插入字符
e) erase() //刪除字符
f) clear() //刪除全部字符
g) replace() //替換字符
h) + //串聯字符串
i) ==,!=,<,<=,>,>=,compare() //比較字符串
j) size(),length() //返回字符數量
k) max_size() //返回字符的可能最大個數
l) empty() //判斷字符串是否爲空
m) capacity() //返回重新分配之前的字符容量
n) reserve() //保留一定量內存以容納一定數量的字符
o) [ ], at() //存取單一字符
p) >>,getline() //從stream讀取某值
q) << //將謀值寫入stream
r) copy() //將某值賦值爲一個C_string
s) c_str() //將內容以C_string返回
t) data() //將內容以字符數組形式返回
u) substr() //返回某個子字符串
v)查找函數
w)begin() end() //提供類似STL的迭代器支持
x) rbegin() rend() //逆向迭代器
y) get_allocator() //返回配置器
提取子串和字符串連接
s.substr();//返回s的全部內容
s.substr(11);//從索引11往後的子串
s.substr(5,6);//從索引5開始6個字符

scanf() printf()

函數名:scanf
功能:執行格式化輸入
用法:int scanf(char *format,[argument,…]);
scanf()函數是通用終端格式化輸入函數,它從標準輸入設備(鍵盤)讀取輸入的信息。可以讀入任何固有類型的數據並自動把數值變換成適當的機內格式。
其調用格式爲:scanf(“<格式化字符串>”,<地址表>);
scanf()函數返回成功賦值的數據項數,出錯時則返回EOF;
其控制串由三類字符構成:
1、格式化說明符
2、空白符
3、非空白符

%a 讀入一個浮點值(僅C99有效)
%A 同上
%c 讀入一個字符
%d 讀入十進制整數
%i 讀入十進制,八進制,十六進制整數
%o 讀入八進制整數
%x 讀入十六進制整數
%X 同上
%c 讀入一個字符
%s 讀入一個字符串
%f 讀入一個浮點數
%F 同上
%e 同上
%E 同上
%g 同上
%G 同上
%p 讀入一個指針
%u 讀入一個無符號十進制整數
%n 至此已讀入值的等價字符數
%[] 掃描字符集合
%% 讀%符號
Printf()
符號 作用
──────────────────────────
%c 單個字符
%d 十進制有符號整數
%e 以“科學記數法”的形式輸出十進制的浮點數 如2.451e+02
%f 輸出十進制浮點數,不帶域寬時,保留6位小數
%g 選用e或f格式中較短的一個輸出十進制浮點數,不輸出無效零
%0 無輸出無符號八進制整數
%p 指針的值
%s 輸出字符串
%u 輸出無符號十進制整數
%x, %X 輸出無符號十六進制整數 (不輸出前綴Ox)

printf("a=%d ", a); /結果輸出十進制整數a=1234/
printf("a=%6d ", a); /結果輸出6位十進制數a= 1234/
printf("a=%06d ", a); /結果輸出6位十進制數a=001234/
printf("a=%2d “, a); /a超過2位, 按實際值輸出a=1234/
printf(”*i=%4d ", i); /輸出4位十進制整數i= 12/
printf("i=%-4d ", i); /輸出左對齊4位十進制整數i=12/
printf("i=%p ", i); /輸出地址i=06E4/
printf("f=%f ", f); /輸出浮點數f=3.141593/
printf("f=6.4f ", f); /輸出6位其中小數點後4位的浮點數
f=3.1416
/
printf("x=%lf ", x); /輸出長浮點數x=0.123457/
printf("x=%18.16lf ", x);/輸出18位其中小數點後16位的長浮點
數x=0.1234567898765432
/
printf("c=%c ", c); /輸出字符c=A/
printf("c=%x ", c); /輸出字符的ASCII碼值c=41/
printf("s[]=%s ", s); /輸出數組字符串s[]=Hello, Comrade/
printf("s[]=%6.9s ", s);/輸出最多9個字符的字符串s[]=Hello,
Co
/
printf("s=%p ", s); /輸出數組字符串首字符地址s=FFBE/
printf("p=%s ", p); / 輸出指針字符串p=How do you do
/
printf("p=%p ", p); /輸出指針的值p=0194/

getchar()和putchar()函數是單個字符輸入/輸出函數,getchar有一個int型的返回值。當程序調用getchar時.程序就等着用戶按鍵。用戶輸入的字符被存放在鍵盤緩衝區中。直到用戶按回車爲止(回車字符也放在緩衝區中)。當用戶鍵入回車之後,getchar纔開始從stdio流中每次讀入一個字符。getchar函數的返回值是用戶輸入的字符的ASCⅡ碼,如出錯返回-1,且將用戶輸入的字符回顯到屏幕。如用戶在按回車之前輸入了不止一個字符,其他字符會保留在鍵盤緩存區中,等待後續getchar調用讀取。也就是說,後續的getchar調用不會等待用戶按鍵,而直接讀取緩衝區中的字符,直到緩衝區中的字符讀完爲後,纔等待用戶按鍵。
gets()和puts()是文本行輸入/輸出函數。gets()從標準輸入設備讀字符串函數,其可以無限讀取,不會判斷上限,以回車結束讀取。出於安全考慮,一般用gets_s()代替gets()函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章