C/C++字符与字符串的读取

一直以来就对C++的字符读入模模糊糊,下午总结了一下,顺便看了若干大神博客,就写了这篇东拼西凑的粗略总结,详细的请看文末的链接。不知道部分借鉴算不算侵权,侵删。

字符篇

scanf("%c", &ch)

读入任意字符,包括回车在内的空白字符

fgetc(FILE*)与getc(FILE*)

两者从指定流读取一个字符,该字符可以是回车在内的空白字符。关于两者的区别,貌似是前者是函数,而后者是宏,详见https://www.cnblogs.com/aqxin/archive/2011/05/20/2052069.html

fgetchar(void)与getchar(void)

从标准输入中读取一个字符,可以读取空白字符。fgetchar()好像现在已经废除了。

cin

读入非空白字符。

cin.get(void)单独使用

相当于getchar()用于吃掉回车,内部没有参数

cin.get(char) 用于读入一个字符

通过cin.get(ch)来读取单个字符,可以读取空格,制表符,回车(读取回车时,按一下回车即可)

#include<iostream>
using namespace std;
int main()
{
	char ch;
	cin.get(ch);
	cout<<ch<<endl;
	return 0;
}

字符串读取

scanf("%s", s)

不可以读入空白字符,同时,如果一开始为空白字符,无论有多少个空白字符,scanf会自动跳过直到读到非空白字符为止。

gets(char*)读入一行

可以读入空白字符,不能读入回车符。需要包含"#include"

fgets(char*, int, FILE*)

读入一行指定长度的内容,读入行末回车,可以读入空白字符

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
    char ch[20];
    cout<<"输入:"; 
    fgets(ch, 20, stdin);
    cout<<"输出:"; 
    cout<<ch;
    cout<<"长度:"<<strlen(ch); 
    return 0;
}

输入时直接输入回车,结果如下
在这里插入图片描述

cin

读入字符串,不可以读入空白字符

cin.get(char*, int[, char])用于读入一行字符串

可以读入空白字符,注意若第一个参数是指针,则一定要有第二个参数,同时,指定长度包括了’\0’终止符,因此实际长度为指定长度减去1。该函数无法读入回车符。注:不能读入回车符但能读入其他空白字符,意思即为终止符为回车符且不读入。

#include<iostream>
using namespace std;
int main()
{
	char ch[20];
	cin.get(ch, 10);
	cout<<ch<<endl;
	return 0;
}

cin.get()与cin.getline()函数的区别:1,当在终止符之前的字符超过限制长度时,系统会报错(其他博客上有提到,但我家电脑没有报错),不再执行后续的cin。2,两者遇到终止符后的表现不同,cin.get()遇到终止符后会将终止符留在缓冲区,等待下一次读入,而cin.getline()读到终止符后会将终止符抛弃。

cin.getline(char* , int [, char ])

其中方括号括起来的部分为可选参数,当只有两个参数时,该函数的功能与cin.get(char*, int)一样,但是当存在第三个参数时就会出现问题,什么问题呢?假设对应语句为cin.getline(s, a, ch),除非读到了char中指定的字符ch,或者读够了len个字符,否则该函数会一直读入。从其他人博客的解释来看,第三个参数为终止符,当没有第三个参数时,终止符为回车符,但是当有第三个参数时,相当于人为规定了终止符,因此结束输入有两个条件,一个是达到限制的字符数,一个是读取到终止符。

#include<iostream>
using namespace std;
int main()
{
    char ch[20];
    cin.getline(ch, 10, 'a'); 
    cout<<ch;
    return 0;
}

一个测试
输入:
1st
2nd
3rd
输出:
在这里插入图片描述

当只有两个参数时,无法读入回车符,当有三个参数时,可以读入回车符。

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
    char ch[20];
    cout<<"输入:\n"; 
    cin.getline(ch, 10, 'a');
    cout<<"输出:\n"; 
    cout<<ch<<endl;
    cout<<strlen(ch);
    return 0;
}

在这里插入图片描述

由输出格式以及字符串长度就可以知道回车符被读入了。

getline(istream is, string str[, char ch])

getline与上边的函数区别就是getline第二个参数需要是string类型,这点与上方不同。最后一行为终止符,不读到终止符不会停止读入,这也意味着输入换行符是没有用的。

参考博客:https://blog.csdn.net/u011486738/article/details/82082405
https://blog.csdn.net/life_liver/article/details/8761299
https://blog.csdn.net/a3192048/article/details/80303547(大神博客)
https://blog.csdn.net/livecoldsun/article/details/25489429(大神博客)

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值