汉字所占字节差异、清空输入缓冲区函数

文章开始

说一下IDE和语言的问题.首先,集成开发环境(IDE,Integrated Development Environment)是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具.集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套.所有具备这一特性的软件或者软件套(组)都可以叫集成开发环境.有很多种类的IDE,比如说Visual StudioVisual C++Notepad++CodeBlocks等等,那应该选那个呢?其实没有最好的IDE,我只能说,有使用人数最多的IDE:Visual Studio,学校里一般会使用的IDE:Visual C++.
然后是语言,编程语言那么多,该选哪个呢?CC++C#javapythonVB等等.但是,我本人认为,和IDE一样,编程语言只是一种工具,没有最好的IDE,也没有最好的编程语言,不是懂得很多编程语言的人就很厉害,真正厉害的是在一门编程语言上认识很深的人.我自己就走了弯路,学习了很多编程语言,并且都学得很浅,这是非常错误的做法.这就好比刚开始写字,我不仅学草书,还学楷书,还学行书,这有什么用呢,认准一个字体练就可以了,能写不就行了吗?
所以我现在尽量避免学其他的语言,专注学C++,甚至尽量避免了解Java Python,专一不管在哪个领域都是一个良好的品质.

先来看一段很有意思的代码:

#include <iostream>
#include <Windows.h>
#include <string>

using namespace std;

struct Student{
	string name;
	string addr;
	char sex;
	int age;
};

int main(void){
	Student student;
	
	cout << "请输入年龄"<<endl;
	cin >>student.age;
	cout << "请输入名字"<<endl;
	cin >>student.name;
	cout << "请输入性别"<<endl;
	cin >>student.sex;
	
	fflush(stdin);//清空输入缓冲区
	
	cout << "请输入地址"<<endl;
	cin >>student.addr;
	
	//输出信息
	cout << "年龄:"<<student.age<<endl;
	cout << "姓名:"<<student.name<<endl;
	cout << "性别:"<<student.sex<<endl;
	cout << "地址:"<<student.addr<<endl;

	system("pause");
	return 0;
}

这是输出结果
在这里插入图片描述
看完后相信有人已经看出了问题所在,有人还是一脸懵逼,我们先不谈代码对错.先说下代码风格,我觉得代码风格很重要,如果你的代码规范工整,不仅自己看起来舒服,别人也会高看你一眼.这是我的代码风格,对不同的功能用空出一行的方式分开,变量名的用处一眼可知.告诫初学者变量名不要随意乱取,尽量用英文,尤其不要用汉字首字母,也许当时我变量名取个a写起来方便,用起来也方便,但是当你过几个星期重新看你的代码的时候你会觉得很陌生:这个a是干什么的?又要重新看一遍代码,现在代码少,还可以重新看,当你以后工作的时候,一个项目几十万行代码,你一一重看吗?变量名字取个xsxm(学生姓名)后面还不写注释的,之后维护的时候你会想打死之前乱命名的自己.单词不会可以嘛,写代码又不是考试,不会限制你用搜索引擎的.
我追求代码本身可读,所以代码的格式会比较严谨,以减少注释,在程序关键的地方,函数,算法可以加上注释,突出重点,注释虽然重要,但也不要滥用.还有就是我喜欢用Java风格的大括号,因为我觉得大括号占单独一行显得有些冗余.
来看一下代码,究竟哪里有问题呢?问题就出在结构体定义里的char sex上,32位中char占一个字节,int占四个字节,而一般情况下在Windows系统中汉字占两个字节,在Linux系统中占三个字节,都超过了char的存储容量,所以把char sex改为string sex即可.

小知识

这里我用到了一个清空输入缓冲区的函数fflush(stdin);那么,什么是输入缓冲区呢?当用户向控制台输入数据时,从键盘输入的数据不是直接传给程序的,而是存到缓冲区,在用户输入完毕按回车键后,输入的一行数据全部进入输入缓冲区,然后再做他用.
下面是个典型的例子:

#include <iostream>
#include <Windows.h>
#include <string>

using namespace std;

int main(void){
	int age[5];
	int i;
	for(i=0;i<5;i++){
		cout << "请输入第"<<i+1<<"位学生的年龄"<<endl;
		cin >> age[i];	
	}

	for(i=0;i<5;i++)
		cout << "第"<<i+1<<"位同学的年龄为:"<<age[i]<<endl;
	
	system("pause");
	return 0;
}

你可以这样输入
在这里插入图片描述
也可以这样输入
在这里插入图片描述
感觉第二次的输入很奇怪吧?这就是我上面说的:当用户向控制台输入数据时,从键盘输入的数据存入缓冲区,再根据输入缓冲区数据中的空格,制表符(tab),回车分隔数据.

注意:此函数仅适用于部分编译器(如VC6),但是并非所有编译器都要支持这个功能(如gcc3.2)。这是一个对C标准的扩充。
无法使用的时候我们可以手写一个函数来达到目的

void cls_buffer(){
	char ch;
	while((ch=getchar())!='\n'&&ch!=EOF);
}

也可以用

cin.clear();
cin.sync();

不过第二种也有局限性.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值