1.对于昨天的那个问题,首先大家要知道,两个无符号数相减,如果是大数减小数,毋庸置疑,肯定是大于0的;但是如果是小数减大数,则会减法溢出,查看结果可知,还是无符号数,也大于0,如:unsigned a = 10;unsigned b = 20,则a – b = 0xffff fff6,对于无符号数来说,还是大于0,故我们知道了,两个无符号数相减,无论怎样,其结果肯定也是一个无符号数,而sizeof得到的数为一个无符号数,故结果始终打印:
2.关于格式化输入的scanf函数简单吧!大家看看下面一个程序的结果是什么?
首先,我们来说说这个程序怎么输入?当我们按照上面的格式输入,如2a3的时候,结果提示我还要输入,随便乱输入一个aaa则打印:
没有按照我们要求的打印,但是当我们输入3g5的时候,却打印:
这是什么原因呢?我们可以多测试几个值,会发现,当我们输入第二个字符,即ch的时候,只要是f以后的字母,即g、h、……等都可以正常打印,这是因为scanf()函数的约束所致,其实,在scanf()进行输入的时候,有三种情况会结束一次输入:
遇到空白符;遇到指定宽度结束,由m指定;遇到不可转换的字符
这些情况下scanf都会结束输入,上面的我们是输入十六进制,正好到了f,所以,当我们输入f以后的字符的时候,就可以正常输出,大家再看看这个例子:
正常输入a d s则正常打印:
这是因为星号*是一个抑制符,独到数据不会赋值给变量,直接放弃。
关于scanf函数,别看着那么简单,实际上,很复杂,这里只介绍一小部分,大家可以看看百度百科对scanf的讲解,很详细!
3.在Windows中,对于输入缓存的清除,可以直接用fflush()清除缓存;在linux清除键盘缓存有两种方法:
调用setbuf(stdin, NULL); 使用经典问题:char c; while((c = getchar()) != ‘\n’ && c != EOF);
打印的结果:
4.依稀还记得老师给我们布置的一个“挺二”的作业:用格式符打印出四个九九乘法表,分别是左上,左下,右上,右下。
其实很简单,只是一个简单的格式控制:
打印左下的乘法表:
打印左上的乘法表:
打印右下的乘法表:
打印右上乘法表:
5.前面看了这么多,现在完成一个稍微复杂一点的小任务,其实也不难,只是有点麻烦,相当于一个小综合吧!
程序分成几个模块,只要思路清晰,应该能很快写出来。
# 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;
}
代码稍微比前面长了一点,但是,很简单!大伙儿可以看看效果:
至于测试,大家自己试试。程序中存在一些小问题,如果有时间,可以改改。其实,我很想将输入的密码用星号隐藏,类似于我们在ATM机上输密码的样子,在Windows下可以用getch()来实现,但是,在linux下没有这个头文件,不好实现,而且,在linux下的退格是一个大问题,这点,我一直在考虑。大家如果有什么好点子,可以提出来(不是要密码隐藏,而是用星号覆盖)。
后面几天会有动态排序、指针、指针和数组、malloc动态分配和字符串的讲解!谢谢大家支持!