scanf 和 cin 对string 的输入 和坑点

写这个源于 一道题 《1028 人口普查(20)(20 分)》

前言:在网络上 我常常会看见有人说 cin>>的效率慢 不如 scanf 。经过测试 的确是这样子。既然cin>>输入慢 为什么还要用呢?抛开很多很多的问题比如:

1.cin>>可以对类似string 类型进行直接输入。

2.cin>>可以自动转换类型,不需要像scanf写的那么麻烦。

3.等等

// 实验之前 先说下一些已知的结论 因为考虑到 可能有些人不愿意看我实验的内容,可能是因为我太水了吧。--哭~

1.  string使用 scanf进行输入是这样输入的:

	string s;
	scanf("%s",&s[0]);
直接
scanf("%s",s); //无法完成赋值 赋值结束后字符串 s 为空

2.使用scanf给 string 直接结构体赋值后 无法传递给 下一 string的变量。

struct sn {
	string t;
}K,P;

void solve() {

	string s;
	scanf("%s",&K.t[0]);
	P = K;
	s = K.t;
}

答案是:当K.t被正常赋值以后P.t 为空 s也为 空


造成这个原因的是 没有加上 resize(num);这个函数 num是正整数 表示初始化string多少空间。 

    接下来不想讲太多 我还要留一些下面讲 , 不想看的 可以关掉页面了。== (今天怎么啦?)(不说。。~)

//


那么问题来了 我如何使用 scanf()对string进行输入呢?又有什么不同的地方,适不适用 gets ?

这次主要做一个实验:


实验工具: VS2017 , codeblock 17,VC++6.0 不一定全部用上。因为我记得 2017里是没办法使用 gets的 ,它提供了一个叫做gets_s的安全函数 一会也会进行测试。


一般情况之下 我们对 string 类型的变量赋值的时候会使用 cin>> 赋值 两个string值之间可以 使用等于号进行赋值,这个是我们的常识:

比如:

string s,t;
cin>>s;
t = s;

那么 string 类型的数据 在输入后其实也可以像 char 类型的数组一样是一个连续的空间 那么就是因为这个特性 才能用scanf进行输入。那么输入的方法是:对空间的第一个元素所在的地址进行输入。那么我们早就知道对char 数组 或是 char* 空间数组的赋值方法是

char s1[900];
scanf("%s",s1);
scanf_s("%s",s1,sizeof(s1)); // 新版编译器  OJ 不支持
gets(s1);
gets_s(s1,sizeof(s1)); // 新版编译器        OJ 不支持

那么我们推出 使用 scanf对 string 进行输入的方法:

string s;
s.resize(10000);
scanf("%s", &s[0]);

有些人会说 s.resize(10000);这条语句我不加 也可以赋值成功啊~ 他们给我看的是这样的情况(输入NTSD)


赋值成功!! 但是 这是很危险的 我们使用更长的字符串的时候就会赋值失败 比如:


但是我们 启用 resize 的话情况就会不一样。如图:


这样才是正规的写法,但是我们今天不仅研究这个。我们来看看赋值的操作吧。

 直接使用等号赋值的是成功的!!!那今天的实验到此为止么?不是 因为赋值成功还有特例 让它赋值不成功

我们来看 那个最特殊的 特例 让这种方法彻底失败。当然也是犯了一个错误所导致的 resize(num); 

这个最特殊的特例就是 --- 结构体的整体赋值下。或是 结构体中的string赋值给局部(全局)变量下。


如果不加 resize(num);就会出现赋值失败的问题。 


加上就会好了:

RT



由于 VS2017上没有 gets 那么我们使用 vc++6.0来看一下吧!gets也是能正常的赋值的。


然后我使用子函数 在VS2017上模拟了一下 gets 

int gets(char *s) {

	for (char t, *p = s; t = getchar(), s!=NULL&&t != '\n'; p++, *p = 0)
		*p = t;
	return s != NULL ? strlen(s) : 0;
}

也能成功赋值。我觉得这个也是一个替代方案吧 毕竟摆着 cin>>不用 用这个还是很多坑点的啊!!~~

本来想上一下反汇编的~~~但是我也不精反汇编 怕说错被笑 哈哈~~


好好学习,天天向上,加油哦~


  • 16
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值