【知识小帖士 2】细致分析!C++字符串的接收问题

21 篇文章 0 订阅
17 篇文章 0 订阅

【cin的问题】

我们通常使用 cin 来做输入接收,但是使用cin在接收字符串的时候有一个问题:它不能接受带有空格的字符串。因为遇到空格,cin认为输入结束。

#include <iostream>
using namespace std;
#define N 100
int main()
{
    char a[N];
    cin>>a;
    cout<<a;
}

如果,此时你输入字符串"hello world!"

输出结果为:"hello"

【gets函数的缺陷】

1)gets函数,以输入回车作为结束,所以能够解决上述问题。

2)它是C语言中的字符串接收函数,应包含头文件#include <stdio.h>,在#include <iostream>中也能直接使用。

3)但是它有一个缺陷:gets()不安全是因为你给了他一个缓冲区,但是你却没有告诉它这个缓冲区到底有多大,也不知道输入的内容到底有多大,输入的内容可能超出缓冲区的结尾,引起你的程序崩溃。

#include <iostream>
using namespace std;

#define N 100
int main()
{
    char a[N];
    gets(a);    //使用gets()函数接收字符串
    cout<<a;
    return 0;
}

你会看到有一个告警:

warning: this program uses gets(), which is unsafe.

【fgets函数】

fgets函数用来从文件中读入字符串,它可以解决gets函数的缺陷。fgets函数的调用形式如下:fgets(str,n,fp);此处,fp是文件指针;str是存放在字符串的起始地址;n是一个int类型变量。不是很常用,这里暂不做讨论。

【getline函数】

getline函数可以完美解决带空格的字符串输入问题,简明、便捷,使用较为普遍

第一种使用方法:

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
    string str;
    cout<<"please input a character string: ";
    //从cin读入,赋值到str,以换行符作为结束标志,,第三个参数可以不用写,默认是'\n'
    getline(cin,str,'\n');    
    return 0;
}

注意:getline第二个参数不可以为char数组,也就是是说,getline只可以赋值给string类。

第二种使用方法:

#include <iostream>
using namespace std;

#define N 100
int main()
{
    char a[N];
    cin.getline(a,N,'\n');     //第三个参数可以省略,系统默认为'\0'
    cout<<a;
}

1)cin.getline()函数的三个参数分别是:缓冲区指针,最大接收长度(包括字符串结束标志'\0'),输入结束标志

2)cin.getline第二个参数不可以为string类的对象,只能为字符指针(char *)

 

报名我的信息学竞赛课(C++基础课程、NOIP算法课程、市赛、区赛集训课程),可以加微信?????联系我,注明“姓名+CSDN 课程咨询”~

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值