1.对于昨天的那个问题,首先大家要知道,两个无符号数相减,如果是大数减小数,毋庸置疑,肯定是大于0的;但是如果是小数减大数,则会减法溢出,查看结果可知,还是无符号数,也大于0,如:unsigned a = 10;unsigned b = 20,则a – b = 0xffff fff6,对于无符号数来说,还是大于0,故我们知道了,两个无符号数相减,无论怎样,其结果肯定也是一个无符号数,而sizeof得到的数为一个无符号数,故结果始终打印:

第四天_程序

2.关于格式化输入的scanf函数简单吧!大家看看下面一个程序的结果是什么?

第四天_程序_02

首先,我们来说说这个程序怎么输入?当我们按照上面的格式输入,如2a3的时候,结果提示我还要输入,随便乱输入一个aaa则打印:

第四天_程序_03

没有按照我们要求的打印,但是当我们输入3g5的时候,却打印:

第四天_字母_04

这是什么原因呢?我们可以多测试几个值,会发现,当我们输入第二个字符,即ch的时候,只要是f以后的字母,即g、h、……等都可以正常打印,这是因为scanf()函数的约束所致,其实,在scanf()进行输入的时候,有三种情况会结束一次输入:

遇到空白符;遇到指定宽度结束,由m指定;遇到不可转换的字符

这些情况下scanf都会结束输入,上面的我们是输入十六进制,正好到了f,所以,当我们输入f以后的字符的时候,就可以正常输出,大家再看看这个例子:

第四天_字母_05

正常输入a d s则正常打印:


第四天_字母_06

这是因为星号*是一个抑制符,独到数据不会赋值给变量,直接放弃。

关于scanf函数,别看着那么简单,实际上,很复杂,这里只介绍一小部分,大家可以看看百度百科对scanf的讲解,很详细!

3.在Windows中,对于输入缓存的清除,可以直接用fflush()清除缓存;在linux清除键盘缓存有两种方法:

调用setbuf(stdin, NULL);  使用经典问题:char c; while((c = getchar()) != ‘\n’ && c != EOF);

第四天_程序_07

打印的结果:

第四天_字母_08

4.依稀还记得老师给我们布置的一个“挺二”的作业:用格式符打印出四个九九乘法表,分别是左上,左下,右上,右下。

其实很简单,只是一个简单的格式控制:

第四天_程序_09

打印左下的乘法表:


第四天_字母_10


第四天_程序_11

打印左上的乘法表:

第四天_程序_12



打印右下的乘法表:

第四天_字母_13

第四天_字母_14

打印右上乘法表:

第四天_程序_15

5.前面看了这么多,现在完成一个稍微复杂一点的小任务,其实也不难,只是有点麻烦,相当于一个小综合吧!

第四天_程序_16

程序分成几个模块,只要思路清晰,应该能很快写出来。

# include <stdio.h>

# include <string.h>

# include <stdlib.h>

int flag = 3;   //次数的标志量

int f1 = 0;     //是否加密加密的标志量

int t = 0;      //只让mima()函数执行一次

static char *array = NULL;

void menu()

{

   printf("\n***************************************\n\n");

printf("\n* 1.发消息2.开始游戏3.打电话4.退出*\n\n");

   printf("\n***************************************\n");

   printf("\n请选择:");

}

void disp()

{

   printf("\n***************************************\n");

   printf("\n*          您想对此操作加密吗?       *\n");

   printf("\n*           1.是     2.否           *\n");

   printf("\n***************************************\n");

   printf("\n请选择:");

}

void disp1()

{

   printf("\n***************************************\n");

   printf("\n*          此操作已经被加密!        *\n");

   printf("\n*             你想解密吗?            *\n");

   printf("\n*         1.是          2.否        *\n");

   printf("\n***************************************\n");

   printf("\n请选择:");

}

void dencrypt(char k[])

{

   int i = 3,f4 = 0;

   char mima1[20] = {0};

   printf("请输入密码:");

   scanf("%s",mima1);

   while(--i)

   {

       if(!strcmp(mima1,k))

       {

           printf("解密成功!\n");

           printf("欢迎您发送消息…………\n");

           f4 = 1;

           f1 = 0;

       }

       else

       {

           printf("密码输入错误,请重新输入!您还有%d次输入的机会!\n",i);

           printf("请输入密码:");

           setbuf(stdin,NULL);

           scanf("%s",mima1);

       }

   }

   if(f4==0)

   {

       printf("密码错误超过三次!退出系统\n\n");

       exit(0);

   }

}

void mima()

{

   int flag = 0,i = 3;

   char mima[20] = {0};

   char pwd[20] = {0};

   printf("请输入密码:");

   scanf("%s",pwd);

   setbuf(stdin,NULL);

   printf("请确认密码: ");

   scanf("%s",mima);

   while(--i)

   {

       if(!strcmp(mima,pwd))

       {

           printf("\n加密成功!\n");

           printf("欢迎您发送消息…………\n");

           flag = 1;

           f1 = 1;

           array = pwd;

           break;

       }

       else

       {

           setbuf(stdin,NULL);

           printf("两次输入的密码不正确,请重新输入!您还有%d次输入的机会!\n",i);

           printf("请输入密码:");

           scanf("%s",pwd);

           setbuf(stdin,NULL);

           printf("请确认密码:");

           scanf("%s",mima);

       }

   }

   if(flag==0)

   {

       printf("密码错误超过三次,退出系统!\n\n");

exit(0);

   }

}

void func()

{

   int i = 0,f = 0;

while(1)

   {

       menu();

       scanf("%d",&i);

       while(i<1||i>4)

       {

           setbuf(stdin,NULL);

           printf("输入有误,请重新输入:");

           scanf("%d",&i);

       }

       if(i == 1)

       {

           if(t == 0)

           {

               disp();

               scanf("%d",&f);

               while(f<1||f>2)

               {

                   setbuf(stdin,NULL);

                   printf("输入有误,请重新输入!");

                   disp();

                   scanf("%d",&f);

               }

               if(f==1)

               {

                   mima();

                   t = 1; //已经创建了密码,以后不必要创建了

                   func();

               }

               if(f==2)

               {

                   printf("欢迎您下次再来!\n");

                   func();

                   t = 0;//只是退出了,没有创建密码

               }

           }

           if(t == 1)

           {

               disp1();

               scanf("%d",&f1);

               while(f1<1||f1>2)

               {

                   printf("输入有误,请重新输入!");

                   disp1();

                   setbuf(stdin,NULL);

                   scanf("%d",&f1);

               }

               setbuf(stdin,NULL);

               if(f1 == 1)  //确认要解密

               {

                   dencrypt(array);

                   f1 = 0;

                   t  = 0;

               }

               if(f1 == 2) //如果选择取消

               {

                   printf("您选择取消!\n");

                   func();

               }

           }

       }

       if(i == 2)

           printf("欢迎进入游戏…………\n");

       if(i == 3)

           printf("欢迎您打电话…………\n");

       if(i == 4)

           exit(0);

   }

}

int main()

{

  func();

  return 0;

}
代码稍微比前面长了一点,但是,很简单!大伙儿可以看看效果:

第四天_字母_17

至于测试,大家自己试试。程序中存在一些小问题,如果有时间,可以改改。其实,我很想将输入的密码用星号隐藏,类似于我们在ATM机上输密码的样子,在Windows下可以用getch()来实现,但是,在linux下没有这个头文件,不好实现,而且,在linux下的退格是一个大问题,这点,我一直在考虑。大家如果有什么好点子,可以提出来(不是要密码隐藏,而是用星号覆盖)。

后面几天会有动态排序、指针、指针和数组、malloc动态分配和字符串的讲解!谢谢大家支持!