从零开始学编程---第一步-C语言(三)
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()基本不用的
最新内容
热点内容
- QQ群
- 返回首页
- 返回顶部