文章开始
说一下IDE和语言的问题.首先,集成开发环境(IDE,Integrated Development Environment)是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具.集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套.所有具备这一特性的软件或者软件套(组)都可以叫集成开发环境.有很多种类的IDE,比如说Visual Studio、Visual C++、Notepad++、CodeBlocks等等,那应该选那个呢?其实没有最好的IDE,我只能说,有使用人数最多的IDE:Visual Studio,学校里一般会使用的IDE:Visual C++.
然后是语言,编程语言那么多,该选哪个呢?C、C++、C#、java、python、VB等等.但是,我本人认为,和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();
不过第二种也有局限性.