字符读取方式汇总

一、字符输入

getch()与getchar()

getch包含在头文件conio.h

getchar包含在头文件stdio.h

getch的功能就是从控制台读取一个字符,但不显示在屏幕上。并且很重要的一点是getch直接从键盘获取键值,不等用户回车,只要用户按下一个键,getch就立刻返回。

#include <iostream>
#include<conio.h>
#include<cstdio>
using namespace std;

int main()
{
    char s;
    while(s=getch())
        cout<<s<<endl;
    return 0;
}

getchar函数是等着用户按键,等用户输入,字符被存放在键盘缓冲区中,直到用户按下回车为止,并且回车符也会放在缓冲区中。当用户按下回车键后,getchar才开始从stdio流中每次读取一个字符。getchar返回值是用户输入的第一个字符的ASCII码,若出错,则返回-1。如果用户输入了不知一个字符,其他服1会保留在缓冲区中,等待getchar读取完。

#include <iostream>
#include<conio.h>
#include<cstdio>
using namespace std;

int main()
{
    char s;
    while(s=getchar())
        cout<<s<<endl;
    return 0;
}


getch()是非缓冲输入函数,即不能用getch来接受缓冲区已存在的字符。而getchar是读取缓冲区中的字符。

二、字符串的输入

1.scanf("%s",s)

scanf输入时,会跳过前面所有空白字符,直到再次遇到空白字符才会结束输入,并在读入的字符串后面自动补上'\0',作为字符串的结束标志。同时也会将后面的空白字符留在输入流中。要注意的是,scanf函数在遇到空格或TAB就会停下来。

#include <iostream>
#include<cstdio>
using namespace std;

int main()
{
    char s[20];
    while(scanf("%s",s))
        cout<<s<<endl;
    return 0;
}


2.gets

gets函数以换行符作为结束的标记。它会将换行符前面的所有字符读入,并在字符串后面自动加上一个'\0',换行符将会被丢弃,换行符后面的仍然留在输入流。但是要注意的是gets可以无限制的读取内容,这就可能产生溢出。

#include <iostream>
#include<cstdio>
using namespace std;

int main()
{
    char s[100];
    while(gets(s))
        cout<<s<<endl;
    return 0;
}

3.fgets

因为gets存在缓冲区溢出漏洞,所以在C11里,gets已经被正式废除,而它的“兄弟”fgets仍然可以使用。

fgets(buf,maxn,fin)将从文件fin读取完整的一行放在字符数组buf中。应当保证buf是能够存放下文件的一行内容。除了在文件结束前没有遇到'\n'这种特殊情况外,buf总是以'\n'结尾。当一个字符都没有读取到时,gets返回NULL。

如果想和gets一样,则只需要将代表文件的fin换成stdin即可。

#include <iostream>
#include<cstdio>
using namespace std;

int main()
{
    char s[100];
    while(fgets(s,100,stdin))
        cout<<s<<endl;
    return 0;
}

如果运行上面的程序,可以看出,明显会比gets要多出输出一行,这就是因为以'\n'结尾的原因。

4.getline

函数原形:getline(istream &in,string &s)

从输入流中读取字符到string 类型的变量中。当读入文件结束标志EOF,或换行符,或读到字符串的最大长度则停止。若没有读入字符,则返回false,可用于判断文件是否结束。

#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int main()
{
    string s;
    while(getline(cin,s))
        cout<<s<<endl;
    return 0;
}


  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值