算法功能:
实现注册,登录验证。
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 struct sj //构造账号,密码 5 { 6 char zh[20]; 7 char mm[20]; 8 }; 9 typedef struct sj sj ; 10 sj k={' '}; 11 void menu () // 开始菜单 12 { 13 printf("-----0. 退出-----\n"); 14 printf("-----1. 登录-----\n"); 15 printf("-----2. 注册-----\n"); 16 } 17 int denglu () // 登录 18 { 19 FILE *p; 20 int i =0; 21 int j =0; 22 int d; 23 int t=0; 24 int q=0; 25 char hh; 26 char zh[20]; 27 char mm[20]; 28 p=fopen ("D:\\shuju.txt","r"); //打开文件 29 while ((zh[i] = fgetc (p)) != EOF ) //验证账号 30 { 31 if (zh[i]==k.zh[i]) 32 { 33 i++; 34 } 35 else if( zh[i] == ' ' &&zh[i] != '\n' && i==strlen(k.zh )) //验证账号完毕,准备验证密码。 36 { 37 while ((mm[j] = fgetc (p)) != EOF) 38 { 39 if (mm[j] == k.mm [j]) 40 { 41 j++; 42 continue; 43 } 44 else if (mm[j] ==' '&&mm[i] != '\n'&& j==strlen(k.mm ) ) // 验证密码成功 45 { 46 printf("登录成功!!"); 47 return 0; 48 } 49 else //验证密码失败 50 { 51 t = 1; 52 break; 53 } 54 } 55 } 56 else // 验证下一条账号 57 { 58 i=0; 59 while ( (hh=fgetc(p))!=EOF && q<2) 60 { 61 if (hh==' ' && hh !='\n') 62 { 63 q++; 64 } 65 } 66 q=0; 67 } 68 if ( t ==1) 69 { 70 break; 71 } 72 } 73 fclose(p); 74 printf ("账号或密码错误,请选择:\n 1. 重新输入 \n 2. 注册 \n 0. 退出系统 \n"); // 验证失败 75 scanf ("%d", &d); 76 switch (d) 77 { 78 case 1: 79 return 1 ; 80 break ; 81 case 2: 82 83 return 2; 84 break ; 85 case 0: 86 exit (1); 87 break ; 88 } 89 return 0; 90 } 91 int zhuce ( ) 92 { 93 FILE *p; 94 sj k; 95 printf("请输入账号密码\n账号:"); // 输入注册信息 96 scanf("%s",k.zh ); 97 printf("密码:"); 98 scanf("%s",k.mm ); 99 p = fopen ("d:\\shuju.txt","a"); //打开文件 100 if (p==0) // 验证文件打开是否成功 101 { 102 printf("source text file error \n"); 103 exit (1); 104 } 105 fputs(k.zh,p); // 写入文件 106 fputc(' ',p); 107 fputs(k.mm,p); 108 fputc(' ',p); 109 fputc('\n',p); 110 fclose (p); // 关闭文件 111 printf ("注册成功!!"); 112 return 0 ; 113 } 114 int main () 115 { 116 menu (); // 显示菜单 117 int c; 118 int a; 119 scanf ("%d",&c); 120 switch (c) //选择 121 { 122 case 1 : 123 begin:printf("请输入账号密码\n账号:"); //登录 124 scanf("%s",k.zh ); 125 printf("密码:"); 126 scanf("%s",k.mm ); 127 a = denglu (); 128 if (a == 1 ) // 密码错误 129 { 130 goto begin ; 131 } 132 else if (a == 2) //注册 133 { 134 zhuce (); 135 printf("请登录\n"); 136 goto begin ; 137 } 138 break; 139 case 2 : 140 zhuce (); // 注册 141 printf("请登录\n"); 142 goto begin ; 143 break; 144 case 0 :exit(1); // 退出系统 145 break; 146 } 147 return 0; 148 }
设计思路:
1:
数据以账号+空格+密码+空格的格式存储在txt中。
2:
注册部分,以字符串的形式写入数据。
3:
登录部分,将账号密码的字符串拆分成一个个字符,逐个比对。以空格为标志,分割账号和密码以及结束密码的验证。以输入账号密码的长度为界
细节部分:
1,
输入的账号密码用 构造变量 存储。
2,
登录验证失败可选择重新输入,或注册,用函数的返回值来控制接下来的动作。
3,
采用计数的方式,来解决文件指针换行的问题。
以及密码验证错误的时候,退出验证的双循环。
总结:
作为1.0 版本,能够正常运行 ,但代码方面会比较繁琐,不适合放入长代码的程序中使用。