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)

猜你喜欢

转载自blog.csdn.net/tainys/article/details/85222875