1. 程式人生 > >c/c++ 字元和字串讀入小結(gechar cin getline gets)

c/c++ 字元和字串讀入小結(gechar cin getline gets)

文章來源:http://www.cnblogs.com/StoneXie/p/9603266.html

c/c++ 字元和字串讀入小結(gechar cin getline gets) by slj


getchar:

  逐個字元讀入,可以讀入一切字元,包括空格符和回車符。這個函式很通用,可以代替以下所有函式。注意getchar連回車符都接受,接受回車符意味著可以判斷讀入的字元是不是'\n'。但以下所有函式都不接受空格符和回車符。

  用法:char ch; ch=getchar();
cin:

  既可以讀字元,又可以讀字串。不接受空格符和回車符。
  如果程式需要逐個讀字元,可以用cin。用法:char ch; cin>>ch; 
  如果程式需要讀入空格為結束符的字串,一行輸入多個字串,字串之間以空格為間隔。比如一行輸入多個姓名,程式按姓名排序。

  用法:char s[20];迴圈中呼叫cin>>s ; 或者string s; 迴圈中呼叫cin>>s;

getline(cin,str):

  以回車符為結束符 ,可以讀入一個以回車符為結束符的string(c++風格字串)。需要include <string>

  用法:string str; getline(cin,str); 

gets:

  以回車符為結束符 ,所以可以讀入一個以回車符為結束符的c風格字串 

(1) 有時候,我們需要讀入一行,將這一行的字元(可能包含空格)做為一個字串,那麼可以用一下三種方法 
  getline(cin,str) 
  gets:
  getchar:用迴圈處理

  示範程式碼如下:

#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
int main()
{
/*
//讀入一個以回車符為結束符的字串:方法1:需要#include<string>
    string a;
    getline(cin,a);
    cout<<a;
*/

/*
//讀入一個以回車符為結束符的字串:方法2:需要#include<iostream> 或    #include<cstdio>
    char s[20];
    gets(s);
    printf("%s",s);//或者cout<<s;
*/

/* 
//讀入一個以回車符為結束符的字串:方法3:需要#include<iostream> 或    #include<cstdio>
    char ch,s[20];
    int i=0;
    while((ch=getchar())!='\n') //注意, (ch=getchar())一定要有括號 
    {
        s[i++]=ch;
        //cout<<i;
    }
    s[i]='\0';
    printf("%s",s);//或者cout<<s;
*/

    return 0;
}


(2) 有時候,我們需要逐個讀入字元,可以根據情況靈活選擇用getchar 和 cin,但是要注意它們有很重要的區別

  如果程式需要接受回車符,那麼用getchar方便書寫程式碼。

  如果程式不需要接受回車符,那麼用cin比較方便。

  以下示範程式碼說明了cin和getchar在逐個字元讀入時的區別:

#include<iostream>
using namespace std;
int main()
{
/*
//如果統計字元個數,輸入 i am a stu後,按回車,以ctrl+z結束,結果為 7 
char ch;
int i=0;
while(cin>>ch) i++;
cout<<i;
*/

/*
//如果統計字元個數,輸入 i am a stu後,以回車符結束,結果為10 
char ch;
int i=0;
while((ch=getchar())!='\n') i++;
cout<<i;
*/

//如果統計單詞數目,輸入 i am a stu後,按回車,以ctrl+z結束,結果為 4 
char s[20];
int i=0;
while(cin>>s) i++;
cout<<i;
return 0; 
}

  比如:NOIP2015地雷遊戲,每一行中字元之間沒有空格,行尾有回車符。最好用cin,因為如果用getchar(),讀入程式的內迴圈的條件迴圈變數<=原有的列數+1,你還需要判斷讀入的是不是回車符或者做其他的處理。
  地雷遊戲讀入地圖程式碼如下:

#include<bits/stdc++.h>
using namespace std;
bool a[105][105];//一張地圖,有雷為一,無雷為零 
int main()
{
    memset(a,0,sizeof(a));//地圖最開始清空 
    int n,m;
    char tmp;
    cin>>n>>m; 
    for(int i=1;i<=n;i++)//讀入地圖 
    {
        for(int j=1;j<=m;j++) 
        {
            cin>>tmp;//讀入每一個點 
            if(tmp=='*') a[i][j]=1;//如果是地雷就將這個點設為一 
        }
    }
    
}

 (3)有時候,我們需要讀入一行字元,這一行字元中包含以空格為間隔的多個字串。

  比如:輸入一個英文句子,統計單詞的數量。

  這種情況,不能用gets,getline,可以用getchar,cin,但從程式碼書寫方面來看cin最方便,當然用getchar會使得程式執行更快

  用法:迴圈中呼叫cin。while(cin>>str) 。如果事先不知道一行中字元或字串的數量,則輸入完先回車,再以ctrl+z結束。程式碼見(2)