从零开始学编程---第一步-C语言(三)

时间:2014-03-02 22:22    点击:

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()基本不用的



来源:幻想编程//所属分类:站长原创/更新时间:2014-03-02 22:22
顶一下
(37)
94.9%
踩一下
(2)
5.1%
上一篇:从零开始学编程---第一步-C语言(二)
下一篇:从零开始学编程---第一步-C语言(四)
相关内容