欢迎大家加零度编程群161433809 深度交流,零度编程——计算机应用技术交流群 是一个计算机应用技术深度交流的平台,一个计算机应用技术学习探讨的社区。 交流内容: 包括Photoshop图像处理,Flash动画制作,Dreamweaver网页设计;信息工程,网络工程,软件工程;C语言程序设计,C++程序设计,C#程序设计;Silverlight 开发;嵌入式开发,数据库开发;.NET技术,Web技术,Cloud Computing技术等。 交流网址: http://tieba.baidu.com/club/11258479/ http://hi.csdn.net/space-10191169.html http://hi.baidu.com/关于安小晗/home http://home.51cto.com/index.php?s=/space/3792937 http://home.115.com/9472935/infos http://tieba.baidu.com/i/143817179 http://weibo.com/u/2062343173 http://t.163.com/1996267015 http://www.docin.com/an_xiaohan http://t.qq.com/yuluojintian |
|
| 开始C语言学习时,你们需要在电脑装Microsoft Visual C++ V6.0,这是编译工具,C语言,C++程序都能编译,直接搜索名字就能找到下载,如果电脑有其他工具可以编译C语言的话,也就不需要下载了 (文章中如有错误处,敬请各位朋友指出以改正。这是我用整整6个小时查阅资料,参考论坛才写出来的。因便于各位朋友学习,我采取的是论坛交流的格式,希望各位都能在这篇文章中学有所得,学有所获。) |
| 首先,让我们看一个C语言程序 #include <stdio.h> main() { printf("hello world \n"); return 0; } |
|
| 这里最简单的一个C语言程序 也是C语言程序组成的基本结构 下面让我们来分析一下 #include <stdio.h> 翻译为#包括 <标准输入输出> h就是英文单词HEAD的第一个字母 这个是头文件,暂时你不需要知道太多,你只需知道暂时我们编程序的时候这个必打,所以背下来吧 main() main是主要的意思,这是个主函数,所有C程序都有这个,这里说的函数并不是数学函数,你可以理解为方法,()括号里面是放参数的,就是数值,现在你先不需要了解,以后会慢慢了解的 {}大括号里面就放着我们打的程序,记住哦,一定要在大括号里面 printf() 这是个输出函数,输出它括号里面的东西,但是一定要在引号里面 \n 这是换行符,用了你就会知道 return 0 这是返回值,这个我们以后在学,其实现在不写这个程序也能通过,所以我暂时不会让这个出现在程序上,虽然这样不好,但为了大家能更好的了解程序,免得大家为了该不该要return犯迷糊 所以这样也是可以的 #include <stdio.h> main() { printf("hello world \n"); } 此程序的结果是在屏幕(6.0工具中就是那个黑的)上打印helli world |
| 现在我们暂时编程序的格式就是这样 #include <stdio.h> void main() { 这里面就是我们要编的程序 } viod是返回类型为空,就是不需要return,这个以后你们会了解的 当当不写void也可以,但是这是为了规范 还算简单吧,这个格式请大家牢记 |
|
| C语言程序中,一定会有数据,这个数据就是由数字,单词和字符构成 数字又分整数和浮点数(浮点数就是小数,数学里也称实数) 字符就是键盘上所有的 a b c A B C 这6个是字符 数字 '1' ' 2' ' 3' 这3个也是字符,但必须得是加了单引号的 + - */ {}、 这些符号也是字符 空格键也是字符 这些都能在ASC表能找到,反之能在ASC表在能找到的就可以是字符 ASC是什么,呵呵,这个上网查一下 还有就是单词,也可以说是字符串 就是比如 hello 或者 hello world 记住:字符用单引号表示,字符串用双引号表示 |
|
| 整数不用我说大家也该知道是什么 123 ,0, -234,1000 这些就是整数 浮点数(小数)也就是凡是带小数点的数就是浮点数 12.3 ,0.0,0.23,-7.7 这些就是小数(我还是直接说小数好了,说浮点有点不爽啊) 浮点数所占字节要比整数大,字节就是内存里的东东,这个暂时不需了解 你只需知道小数占的字节要比整数大就可以了,后面字节这个概念很重要 例如123.4和1234 123.4就必1234所占的字节大 |
|
| 说完数据类型我们说变量 C语言把数据存放在变量中,变量就是电脑内存里的一个盒子,用来保存数字或字符 这个盒子里面的东西是变化的,例如我放一个数字1放进这个盒子,这个盒子现在装的是数字1,然后我又放数字2进入,原来的数字1就自动替换成数字2,然后你放什么进去,它就是总是替换,它是可变的 数据类型就可以用变量来表现 int 整数的意思 它可以申明变量用于存放整数 long int 存放大于32767和小于-32768的整型数据(这个我们暂时用不着,可以忽略) float 浮点的意思,可以申明变量存放小数 double 双点,双重的意思,存放更大的小数(这个也暂时用不着,先忽略) char 字符的意思 申明变量存放字符 |
|
| 每个变量都有名字,因为你得知道你存放的是哪个盒子,所有盒子得标个记号 变量的名字必须用字母开头,大小写都可以,中间可以带下划线,例如age_cat 但绝对不能以数字开头 例如 95age 变量名也不能含空格和特殊字符 例如age cat 和 age*cat 有了变量名你就定义一个变量了,啥叫定义,也就是申明,或者说建立 例如 int a 意思就是说我用一个叫a变量 类型int 存放整数 或者说我拿了一个盒子,做个标记a 以后用来存放整数 int a float b char c 以上的就是定义不同类型的变量 但要记住,在一个程序中,变量名字不能重复 例如 int a int a 或者 int a; float a; 都是错误的 变量名有唯一性 |
|
| 定义了一个变量,我们就可以使用这个变量,可以在里面存放数据 怎么存放?直接用=号就可以了 可以在定义的时候存放 int a=1 也可以在定义后存放 int a; a=1 还可以用表达式来存放 int a; a=3-2; 甚至还可以加入其他变量 int a; int b=2 a=b-1; 另外,定义变量的时候可以连接定义 int a,b 还有 int a=1,b 但是不可以这样 int a=b=1 |
|
| 让我们来个运用变量的程序 #include <stdio.h> viod main() { int a; float b; char c; a=1; b=1.1; c='a'; } 但是这个程序现在还没有什么实质性的作用,变量赋值以后你无法从电脑中看到 所以,接下来我们学习printf()函数,我们把变量的值打印到屏幕上 |
| 在开始的时候大家就已看到printf()的功能 没错 就是printf("hello world \n");,打印字符串hello world到屏幕上 简单来说,printf()就是在屏幕上产生输出,把字符,数字,字符串发送到屏幕上 printf()的格式 printf(“”);可以直接输出引号里的东西 printf(“%d”,a) 这样是直接输出变量int类型a的值 %d的意思:d是decimal base(十进制)的开头字母,意思就是按十进制格式输出,也就是按整数格式输出 还有%f 按浮点数格式输出 %c 按字符格式输出 printf(“%d”,a)的逗号后面只能放值,变量名可以,单纯的值也可以,例如这样printf(“%d”,1),也是可以的 连续输出值可以这样printf(“%d,%f,%c”,a,b,c),引号里的逗号不打也没关系所以printf(“%d%f%c”,a,b,c)也是可以的,但是这样会挤成一堆,自己试下就知道了,所以建议大家养成打逗号的习惯 |
|
| printf("hello world \n"); 里面的\n有什么用 下面我就来为大家介绍,\n今后我们会经常用的 下面看例子 #include <stdio.h> main() { printf("hello"); printf("world"); } 输出结果会是 hello world 吗? 结果是NO 输入结果是helloworld 因为没有回车,printf()只能在一行进行输出 那么怎么进行回车?这就需要\n了,\n是转义符,意思就是它能把你不能用字符打出来的东西,换种形式出来,在程序过程,你不可能中途又去按回车键 所以,这样 main() { printf("hello\n"); printf("world"); } 它就会输出 hello world 转义符还有很多个,例如\t,\\,\*\a \n只是其中一个,其他的等用的时候在介绍吧,反正常用的也就一两个 大家就只要牢记\n这一个,记住是反斜号,n是new-line (新的一行)的开头字母 |
|
| 现在我们来用我们所学的输出几个变量的值 #include <stdio.h> viod main() { int a; float b; char c; a=1; b=1.1; c='a'; printf("%d\n",a); printf("%f\n",b); printf("%c",c) } 结果是 1 1.100000 a 为什么1.1变成了1.100000,因为float 定义的变量小数(浮点数)默认小数点后面保留6位数,那怎么让它输出1.1? 只让让%f变成%.1f就可以了,反之你想让它输出小数点后两位数就%.2f,三位就%.3f,以此类推 程序可以简化为 #include <stdio.h> viod main() { int a=1; float b=1.1; char c=‘a’; printf("整数变量为:%d,浮点数变量为:%.1f,字符型变量为:%c\n",a,b,c); } 结果为 整数变量为:1,浮点数变量为:1.1,字符型变量为: a \n记住一定要在引号里,为了美观,请养成多用\n的习惯,即使整个程序就一个printf()语句(也是也用的) |
| 补充一点 其实转化字符不止%d %c %f等,字符串也有一个,就是%s string(字符串)的开头字母,但是用的少 尽管只打印字符串时可以不需要%S,但是当打印与其他数据组合的字符串时,就可能需要用%S 例如: printf("%s %d %f %c","hello",14,7.2,'a'); 打印结果如下 hello 14 7.200000 a %s %d %f %c 这些是转化符,注意不能放到引号外,打印时要适当隔开,可以用空格或逗号隔开 printf("hello"); 和 printf("%s\n","hello"); 是一样的,显然用第一种更好 这里只能让大家了解一下%s的作用,不需深究,忽略也可 |
|
| 现在我们学会打印了(也就是输出了) 能在程序中打印变量的值了,但也只能打印我们事先在程序中写好的值,能不能在程序过程中自己手动用键盘输入变量的值,在打印出来呢?答案是肯定的 这时我们就要学习scanf()这个函数 一般在程序中,printf()和scanf()是一起使用的 scanf()的功能是从键盘获取数据,同样它也会用到转化字符%d,%f,%c scanf()的格式如下 scanf("%d",&a); 让我们再看看printf(); printf("%d",a); 两个差不多把,只不过scanf()比printf()多了一个&,&是什么?&是取地址符 scanf("%d",&a); 意思就是你从键盘输入一个整型变量的值,它会自动存到变量a那个地址,也就是它会找到那么标记为a的盒子,然后把值放进里面 为什么printf()没&,因为它是直接输出,a变量的地址已经事先知道,而scanf() 变量a的值从外部获取,得先知道变量a的地址,知道地址你才好把值放进去 每个变量名都有对应的地址,变量名只是地址的别名,就好像外号一样,之所以用变量名而不用地址名,因为变量名比地址名好记,方便,而地址名是数字,你不可能知道什么是什么 扯远了,内存地址在学指针的时候你就会知道,现在先别管这些,知道太细反而越弄越糊涂,你现在就只需要知道scanf()的格式 scanf("%d",&a); 和print()差不多,但是变量名前一定要加&,除了scanf("%s",a);字符串格式就不需要,这也跟指针有关系,现在先别管,你只要知道除了%S,其他类型的变量都要在前面加&, 引号里面注意不要加\n,没必要 连续输入也是可以的,scanf("%d,%f",&a,&b);但目前先不要用 |
|
| 下面我们来个输入(scanf)输出(printf)的程序 #include <stdio.h> void main() { int a; float b; char c; printf("请输入a的值:"); scanf("%d",&a); printf("请输入b的值:"); scanf("%f",&b); printf("请输入c的值:"); scanf("%c",&c); printf("a的值为:%d,b的值为:%f,C的值为:%c\n",a,b,c); } 这个是正确的吗?你运行的时候你就会发现,变量c没办法输入了,程序直接结束 哪里有问题? 下面我们来分析 首先程序显示 请输入a的值: 我们输入1,在按回车键 又会显示 请输入b的值: 我们输入1.1 按回车 这时候程序就会显示 请输入c的值:a的值为:1,b的值为:1.100000,C的值为: 这是为什么?别忘了之前说过,空格和回车也是字符 开始输入了1到了变量a里,按回车,继续下一个输入 又输入了1.1到了变量b里 此时再按回车的话,就会被scanf接收了,因为变量c是字符格式,回车也是字符,自动存到变量c里 非字符变量,用scanf连续输入,按空格或回车会等待下一个输入 但是字符和字符串变量,scanf会直接接收空格和回车 怎么解决?在%c前面加一个空格,就是这样scanf(" %c",&c); #include <stdio.h> main() { int a; float b; char c; printf("请输入a的值:"); scanf("%d",&a); printf("请输入b的值:"); scanf("%f",&b); printf("请输入c的值:"); scanf(" %c",&c); printf("a的值为:%d,b的值为:%f,C的值为:%c\n",a,b,c); } 这样程序就能正常运行 所以不管什么变量类型,最好都在前面加个空格,会是一个好习惯 |
|
| 下面多说一点scanf()的用法,我想大家对这个sacnf()的格式还是有点犯糊涂 printf()是格式化输出函数,我想这个你们应该很容易掌握 scanf()是格式化输入函数,顾名思义,就是你在输入时必须按照指定的格式输入才行 例如 #include <stdio.h> main() { int a,b; printf("请输入两个数\n"); scanf("%d%d",&a,&b); printf("a=%d,b=%d\n",a,b); } 这个是连续输入 输入1 回车 输入2 回车 或者 输入1 空格 输入2 回车 注意:最后的回车是必要的,意味着完成输入 结果为 a=1,b=2 现在在改变一下 把scanf("%d%d",&a,&b);改成scanf("%d,%d",&a,&b);中间加一个逗号 那么,再怎么输入? 注意:出现怎么打什么 先输入1,再输入,(逗号),再输入2 回车 就是这样:1,2 回车 结果也是a=1,b=2,如果输入1就回车,那么b的值就没办法获取,而是你想不到的结果(这个自己去运行) 无论出现什么你就照打什么 如scanf("%d;%d",&a,&b);你就打1;2 回车 哪怕是一个字母一个符号,如scanf("%da%d",&a,&b);你得打1a2 回车 如scanf("-%dabc%d",&a,&b);你得打-1abc2 回车 如果符号字母在最后,如scanf("%d%dabc-*^",&a,&b); 你就完全可以无视,直接打 1 回车 2 回车 就可以了 出现在数值之前和之中的东西就要照着打,之后可无视 还有一种情况 像这样scanf("\n%d%d",&a,&b);和scanf("%d%d\n",&a,&b); 这里不要被迷惑了,这里的\n并不是回车,但是它是转义符 转义符有好几个,并不是带斜号的就是 如果是例如这样scanf("\%d%d",&a,&b);和scanf("%d%d\",&a,&b);还有scanf("%d\%d",&a,&b); 无论哪个都会有错(不是结果就是程序报错),所以不要带\号 补充:/号不存在问题 如果是转义符scanf("\n%d%d",&a,&b);和scanf("%d%d\n",&a,&b);还有 scanf("%d\n%d",&a,&b); \n在前面和中间你可以无视,但是如果是在后面scanf("%d%d\n",&a,&b); 就必须这样打了,输入1 回车 输入2 回车 输入任何一个或多个字母,数字或字符 回车 结果就是正确的 a=1,b=2 原因:此时输入数据用转义符结尾,scanf会跳过空白符去读下一个字符,所以你必须再输入一个东西(随便一个或多个字母,数字,字符)。这里的空白符包括:空格,制表符,换行符,回车符和换页符。 就是说scanf()里面多了个\n,scanf会跳过你输入后按的回车键或空格键,再读取一个东西,直到没地方存储才会结束scanf 注意空格也包括 scanf("%d%d ",&a,&b); 和\n一样的道理,要多加小心 所以说\n根本没必要在scanf里 |
|
| 下面继续一个scanf()程序 #include <stdio.h> void main() { char a,b; printf("请输入两个字符\n"); scanf("%c%c",&a,&b); printf("a=%c,b=%c\n",a,b); } 这里只改了一下变量类型,但之前不一样了,还记得我跟大家说了空格和回车也是字符吗,在这个程序里就不要按空格回车了,当然最后一个回车要按,不然结果不会出来 这个程序我们只要输入 xy 回车 结果就是a=x,b=y 我们在改scanf("%c%c",&a,&b);变scanf("%c,%c",&a,&b);加逗号 这个和非字符变量一样,也是输入 x,y 回车 结果是a=x,b=y 在改成空格,scanf("%c %c",&a,&b);字符变量这回是可以打空格也可以不打 输入x y(中间空多少格都没关系) 回车 或者xy 回车 结果a=x,b=y 值得注意是scanf("%c%c",&a,&b);这种情况可千万不要打空格,不然空格的值会传到变量b里 补充:scanf("a=%d,b=%d,c=%d",&a,&b,&c); 输入应为: a=1,b=2,c=3 回车 跟我上面说的照打原理一样 再看一个程序 #include <stdio.h> void main() { char a,b; printf("请输入字符a\n"); scanf("%c",&a); printf("请输入字符b\n"); scanf(" %c",&b); printf("a=%c,b=%c\n",a,b); } 注意空格!虽然字符型需要这样,但最好每次scanf()的时候都搞空格 就是这样scanf(" %d",&a); 关于输出流,缓存,缓冲区之类我们后面有待了解 printf()和scanf()我们暂时先学到这里,今后还有其他的输入输出函数 |
| scanf我可能说的太多,有点复杂了,没看懂你也不要紧 scanf()你目前只需掌握scanf(" %d",&a);这一句的使用方法就可以了 printf()的使用我想应该很容易掌握吧 接下来我们更深层次的往前走了 来点最后补充,想多知道一些的就看看,不看这些也没关系,毕竟不是重要内容 scanf()的其他用法 如: scanf("%d %*d %d",&a,&b); 当输入为:1 2 3时,把1赋予a,2被跳过,3赋予b。 “*”符:用以表示该输入项,读入后不赋予相应的变量,即跳过该输入值。 还有如 scanf("%5d",&a); 输入:12345678 只把12345赋予变量a,其余部分被截去。 %5d 和%.5f 效果差不多 这里是保留5位整数 scanf("%4d%4d",&a,&b); 输入:12345678 将把1234赋予a,而把5678赋予b。 |
|
| 下面我们来说说注释,就是解释说明 电脑能够理解你的程序,然后,其他人或许也会读你的程序,另外,你会经常修改程序,如果程序非常庞大,你可能不记得你之前写的东西有什么功能,别人看了没有注释的代码也很难知道是什么意思 如果你写的程序只是你自己使用,就不需要注释了吗?不是的,即使你当时懂,但过后很久,你也有可能会看不懂,所以,给程序加注释是非常好的习惯 注释怎么用?注意:我们加注释不是给电脑看的,而是给我们人看的,电脑会无视我们的注释,不会运行 #include <stdio.h> void main() { printf("hello world\n"); /*打印hello world*/ } /*.....*/ 这就是注释的第一种格式 #include <stdio.h> main() { printf("hello world\n"); //打印hello world } // 这是注释的第2种格式 显然第2种比较好打 |
| 不是每条语句都要注释 像printf这句一眼就懂就没必要注释了 哪些地方最需要注释,大家会慢慢自然知道 |
| 接下来我们来学习数组吧 尽管C语言没有字符串变量(字符串知道是啥吧) 但仍然有办法存储字符串,那就是用数组(array) 数组是一种特殊的变量类型 所有的数据类型int,float,char等,都有对应的数组类型 数组只不过是具有形同数据类型的许多变量的一个列表而已 说不多说,怎么定义一个数组? char a[12]; 这就是定义了一个字符型的数组 跟普通定义变量而言,它只是多了个方括号,方括号里的数字代表的是数组里所存储的字符长度(就是有多少个字符) 比如 char a[3]={'a','b','c'} 这是纯字符数组 数组是有下标的,表示是哪个字符存放在哪个数组变量 下标都是从0开始的 a[0]='a',a[1]='b',a[2]='c' 注意这里就没有a[3]了哈 a[0],a[1],a[2]其实就是变量,跟平时的变量a,b,c没什么区别,只不过变量名是个死东西,不能改变,它们的值是可以改变的 例如 char a[3]={'a','b','c'}; a[0]='b'; 打印出来的数组就是b,b,c了 还有 char a[4]="abc"; 为什么明明是3个字符,写着却是4? 其实就个数组就是存储的字符串,多出的字符是什么,就是‘\0',叫做NULL零,当然还有别的叫法 C语言用字符串结尾的'\0'来识别字符串的结束,在内存中,只有当c程序遇到null零时猜知道字符串结束了 当然也可以这样存储 char a[4]={'a',"b","c",'\0'} 这就代表它存储的是字符串 也可以不写长度 char a[]="abc"; 记住你所存储的数据所超过长度,会报错的 |
| 下面我们来输入一个字符串,在打印出来 因为我们还不知道输入字符串是多少字符,所以尽量定义的长度大一点 首先定义了个字符数组变量 char a[50]; 长度50,也就是可以容纳50个字符变量 怎么用scanf()输入? scanf(" %s",a); 就可以了,为什么没有&,我前面已经说过了哦,跟指针有关系,等你学了才会知道,记住只有%S 格式可以不需要&哦 下面我们开始程序 #include <stdio.h> main() { char a[50]; printf("请输入一个字符串\n"); scanf(" %s",a); printf("字符串为:%s\n",a); } 我们输入hello 结果显示字符串为:hello 但如果我们输入hello world 结果也显示字符串为:hello 因为有个空格,scanf()在%c字符格式会接收空格(空格也是字符) 但在字符串格式%s中 scanf()遇到空格、回车和Tab键都会认为输入结束 那怎么让字符串输入包含空格,那也是我们下面的内容了 现在让我们把所学的用上面的程序完善一下 #include <stdio.h> main() { int age; //年龄 float high; //身高 char name1[50],name2[50]; //曾经的名字和现在的名字 printf("请输入你的年龄\n"); scanf(" %d",&age); printf("请输入你的身高\n"); scanf(" %f",&high); printf("请输入你曾经的名字\n"); scanf(" %s",name1); printf("请输入你现在的名字\n"); scanf(" %s",name2); printf("你的年龄:%d,你的身高:%.1f,你曾经的名字:%s,你现在的名字:%s\n",age,high,name1,name2); } 数组我们现在还是学的最简单的,以后会慢慢扩充 介绍数组的地方你可能还有点晕,你现在暂时只需了解上面程序数组的用法就可以了 |
|
| 除了printf()和scanf()函数,C语言还有其他输入输出函数,并且他们提供了一些printf()和scanf()没有的功能 我们老学输入输出干什么,别急,这些输入输出函数将是我们以后将要用到的 我们目前只学6个 putchar()和getchar() putch()和getch() puts和gets() putchar()是输出函数,看它的英文名很容易明白,是跟字符有关的,它的功能是把一个字符打印到屏幕 只能一次打一个字符 putchar('a'); 屏幕上出显示一个字符a 如果要打印hello world,需要这样 #include <stdio.h> main() { putchar('h');putchar('e');putchar('l');putchar('l');putchar('o');putchar(' ');putchar('w');putchar('o');putchar('r');putchar('l');putchar('d');putchar('\n'); } 把程序弄美观点 #include <stdio.h> main() { putchar('h'); putchar('e'); putchar('l'); putchar('l'); putchar('o'); putchar(' '); putchar('w'); putchar('o'); putchar('r'); putchar('l'); putchar('d'); putchar('\n'); } 怎么样,很麻烦吧,还不如printf()呢 另外它可以打印字符变量 char a='x'; putchar(a); 打印字符变量的时候不需要引号 这点要比printf()好 printf()需要这样打印 printf("%c",a); 下面程序是putchar()和printf()分别打印字符变量a #include <stdio.h> main() { char a='x'; putchar(a); putchar('\n'); printf("%c\n",a); } 可见putchar()打印字符变量是非常方便的,但用它直接打字符是非常愚蠢的行为,还不如用printf() 但是putchar()一次只能打印一个字符,它的用处会在以后的程序中逐步体现,瞧着吧 getchar()函数的功能是输入一个字符(就是从键盘获取一个字符),和putchar()是对应的 怎么从键盘获取一个字符?这样吗? char a; getchar(a); 这是错的!! 正确获取是这样 char a; a=getchar(); 当你从键盘按下一个字符,它就会自动存到变量a里,可以理解为a的值等于你按下的某个键的值,记住括号里不要放东西 显然这种输入比scanf(" %c",&a) 方便多了,但也只是对于输入一个字符来说方便,scanf可以连接输入,而getchar一次只能输入一个字符 |
|
| 接下来就有点抽象了,尽管getchar()只获取一个字符,但当你在键盘按下一个键后,那个字符并不是马上被getchar()获取,而是到了缓冲区里,缓冲区是一块为输入预留的内存区域,缓冲区不会释放,直到你按下回车,缓冲区里的内容才一次一个字符的方式释放,这好比你寄东西给你朋友,邮局就相当于缓冲区,邮局向你征询要不要确定寄出去,在你确定之前你如果后悔又可以拿回自己的东西,所以你在输入字符的时候还可以用退格键重新修改或不再输入,而回车既等于确定却又是一个字符,回车自己本身也会进入缓冲区 下来来个例子 #include <stdio.h> main() { char a,b; a=getchar(); b=getchar(); putchar(a); putchar(b); } 我们输入x-回车-y-回车 结果会是xy吗?不是的 结果是a=x b='\n'(回车) 当我们开始打x的时候,x在缓冲区,当我们按下回车的时候,第一个getchar()才获取到x这个值 顺利存到a里 但回车既是确定又是字符,回车'\n'它也跟着进了缓冲区,并且和x一起被释放,x到了程序里 回车('\n')也到了程序里,并且被第2个 getchar()获取,此时我们输入y,这时缓冲区里有一个字符 'y', 然后我们又按下回车,'y'和'\n'又一起准备被释放,由于程序里没有第3个getchar(),所以'y'和'\n'还留在缓冲区,但它们两个已经是在准备状态中,如果程序又出现一个getchar(),'y'不需要你按回车它会直接进入到第3个getchar(),getchar()是依次获取,按先后顺序,不会先获取'\n',而'\n'正等待着马上进入第4个getchar() 下面这个程序很好的说明了这个问题 #include <stdio.h> main() { char a,b,c,d; a=getchar(); b=getchar(); c=getchar(); d=getchar(); printf("a获取的是%c\n",a); printf("b获取的是%c\n",b); printf("c获取的是%c\n",c); printf("d获取的是%c\n",d); } 总结来说,当你输入x '\n'(回车) 这两个字符已经同时从缓冲区释放了出来,被两个getchar()分别获取,‘\n’(回车)它进入缓冲区后会连同自己带着'x'又马上一起出来 输入 y '\n'(回车) 这两个字符也被同时释放,被其他的getchar()分别获取 值得提醒的是 #include <stdio.h> main() { char a,b; a=getchar(); b=getchar(); putchar(a); putchar(b); } 你直接输入 xy 会得到你想要的答案 因为输入xy 还没有按回车 此时两个字符都在缓冲区里 等你下回车后,xy'\n'都被释放了出来,xy分别被两个getchar()获取到 但回车('\n')也是在释放准备中(此时它还在缓冲区,不过是准备释放状态),等待被第3个getchar()获取(如果有的话) 所以,两种输入都会让缓冲区存在'\n',而我们根本不需要'\n'存放在我们定义的变量里,就连scanf()也会有缓冲问题,如何解决缓冲区里的'\n'是我们接下来要讨论的问题 |
| 第一种解决办法很简单,请看 #include <stdio.h> main() { char a,b,n1,n2; //n1,n2表示存放回车 a=getchar(); n1=getchar(); b=getchar(); n2=getchar(); printf("a获取的是%c\n",a); printf("b获取的是%c\n",b); } 这个很容易理解了 输入x 回车(两个被同时释放,存到第一,二个gerchar中) 输入y 回车(两个被同时释放,存到第三,四个gerchar中) 正好能得到我们想要的答案,n1,n2变量不需要管,那是专门存放回车('\n'),没任何含义 上面的程序你不能输入xy 再回车,原因你懂 得这样 #include <stdio.h> main() { char a,b,n1; //n1表示存放回车 a=getchar(); b=getchar(); n1=getchar(); printf("a获取的是%c\n",a); printf("b获取的是%c\n",b); } 另外你也可以不定义回车的变量,就这样 #include <stdio.h> main() { char a,b; a=getchar(); b=getchar(); getchar(); //这个getchar存放的是'\n' printf("a获取的是%c\n",a); printf("b获取的是%c\n",b); } 每个getchar()自己本身是有值的,不一定需要变量来等于 所以 printf("%c",getchar()); 这个语句是可行的 另外有些C编译器会给出警告,但仍然能运行,你可以无视警告 |
|
| 第2种解决办法就是我们接下来要学的输入输出函数 那就是getch()和putch()函数,其实用法和putchar()和getchar()是一样的 不过用之前我们得在程序最上面需要加上#include <conio.h>这个头文件,因为只有这个头文件包含这两个函数 这两个也是输入输出一个字符,但它们不再有缓冲区的概念,就是你不再需要按回车在确定了,你输入什么它会直接进入程序里,且不等你的回车 #include <stdio.h> #include <conio.h> main() { char a,b; a=getch(); b=getch(); putchar(a); putchar(b); } 当你输入xy 不需要按回车,等你输入完之后它会立即显示到屏幕上 也就是你输入x立马就进入程序被第一个getch()获取,输入y立马被第2个getch()获取,不再进入缓冲区等待回车来确定 不过你在输入的时候,屏幕上不会显示你正在输入的东西,也就是一片空白,直到你完成输入它就会直接显示结果 如果你要在屏幕上显示你正在打的东西,就需要用putch()函数 #include <stdio.h> #include <conio.h> main() { char a,b; a=getch(); putch(a); b=getch(); putch(b); putchar(a); putchar(b); } getch()也能接收回车,不过是'\r',return的开头,即回到当前行的行首,\n是换行, 回车其实是两个字符一起,分别是\r,\n。\r是回车,即回到当前行的行首,\n是换行,两个效果合起来就是我们所熟悉的到下一行开头。 getchar()接收回车 首先接收到"\r"会去读缓冲区,如果缓冲区没有东西,它会开始等待,直到'\n'过来了,然后'\n'就进到缓冲区里,被getchar()获取,至于'\r',它不会进缓冲区 而getch() 没缓冲区,它接收到的第一个字符就是'\r' 之所以把'\n'称做回车,是让大家便于理解,但'\n'不完全等于回车,它其实是换行 好像越说越复杂了,看不懂也没关系,你现在只要知道getch()按回车并不是接收'\n'就可以了,那些以后会慢慢懂的 getch()自己本身也是值 所以printf("%c",getchar()); 也可以,和getchar()一样 getch()有个缺点,因为没缓冲区的关系,你输入的时候就不能在修改了,缓冲区相当于草稿,但它的优点就是不需要回车来确定了 有点用途大家很熟悉 就是程序需要你按(Y/N)的时候 按Y继续,按N退出,这时直接按Y或N就可以了,而不需要再按一次回车 这里大家只要了解getch()函数就可以了 putch()基本不用的 |