「小白到大牛之路10」交换机管理之端口管理


项目需求

交换机


端口:

1) 端口名称

2) 端口状态

3) 端口的IP地址

4) 端口类型

WAN

LAN


项目实现

1. 添加菜单框架

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

FILE *file; 

void init(void) {
	//打开文件
	file = fopen("users.txt", "r");   
	if (!file) {   //等效于 file == NULL  
		printf("文件打开失败");
		//return 1;
		exit(1);
	}
}

void login(void) {
	char name[32];
	char password[16];
	char line[128];
	char name_tmp[32];
	char password_tmp[16];
	char *ret;
	
	//输入用户名和密码
	while (1) {
		system("cls");
		
		// 输入用户名和密码
		printf("请输入用户名:");
		scanf("%s", name);
		printf("请输入密码:");
		scanf("%s", password);
		
		//从文件中读取账号,并进行判断!
		while (1) {
			//读一行
			ret = fgets(line, sizeof(line), file); //line:  "admin 123456\n"
			if (!ret) {
				break;
			}			
			sscanf(line, "%s %s", name_tmp, password_tmp);
			if (!strcmp(name, name_tmp) && !strcmp(password, password_tmp)) {
				break;
			}
		}
		
		if (ret) {  //用户名和密码匹配成功
			break;
		} else {
			printf("用户名或密码错误!\n");	
			system("pause");
			system("cls");
			
			fseek(file, 0, SEEK_SET); //把文件内部的位置指针设置到文件头
		}
	}
}

void create_user(void) {
	system("cls");
	printf("\n\n---创建账号---\n\n");
	printf("待实现...\n\n");
	printf("\n\n按任意键返回主菜单");
	fflush(stdin);
	getchar();
}

void ip_admin(void) {
	system("cls");
	printf("\n\n---IP管理---\n\n");
	printf("待实现...\n\n");
	printf("\n\n按任意键返回主菜单");
	fflush(stdin);
	getchar();
}


void logout(void) {
	system("cls");
	fclose(file);
	exit(0);
}

void input_error(void) {
	system("cls");
	printf("\n\n输入错误!\n\n");
	printf("\n\n按任意键后,请重新输入\n\n");
	fflush(stdin);
	getchar();
}

void show_memu(void) {
	system("cls");
	// 打印功能菜单
	printf("---交换机后台管理---\n");
	printf("1. 创建账号\n");
	printf("2. IP管理\n");
	printf("3. 退出\n");
	printf("4. 端口管理\n");
	printf("请选择: ");
}

void show_ports(void) {
	system("cls");
	printf("---端口状态---\n");
	printf("待实现.\n");
	system("pause");
}

void set_ports(void) {
	system("cls");
	printf("---端口设置---\n");
	printf("待实现.\n");
	system("pause");
}

void port_admin(void) {
	char n;
	
	while(1) {
		system("cls");
		printf("1. 查看端口\n");
		printf("2. 设置端口\n");
		printf("3. 返回主菜单\n");
		printf("请选择: ");
		
		fflush(stdin);
		scanf("%c", &n);
		if (n == '1') {
			show_ports();
		} else if (n == '2') {
			set_ports();
		} else if (n == '3') {
			break;
		} else {
			input_error();
		} 
	}
}

int main(void) {
	char n; //用户选择的菜单编号
		
	init(); //初始化
	login(); //登录
	
	while (1) {
		show_memu();

		fflush(stdin);
		scanf("%c", &n);
		switch (n) {
		case '1':
			create_user();
			break;
		case '2':
			ip_admin();	
			break;
		case '3':
			logout();
			break;
		case '4':
			port_admin();
			break;
		default:
			input_error();
			break;
		}
	}
	
	return 0;
}

2. 端口信息的表示

添加类型定义和端口变量

struct port {
	char name[16];  //端口的名称
	int  status; //1: 激活  0:禁用
	char ip[16];  //192.168.1.5
	char type[4];  //端口类型 LAN  WAN
};

//定义了5个端口变量
struct port port1;
struct port port2;
struct port port3;
struct port port4;
struct port port5;

3. 实现功能

void show_port(struct port port) {
	printf("名称[%s]\t状态[%s]\tIP[%s]\t类型[%s]\n", 
		port.name,
		port.status == 0 ? "禁用":"激活",
		port.ip,
		port.type);
}

void show_ports(void) {
	system("cls");
	printf("---端口状态---\n");
	
	printf("PORT1:\t");
	show_port(port1);
	
	printf("PORT2:\t");
	show_port(port2);
	
	printf("PORT3:\t");
	show_port(port3);
	
	printf("PORT4:\t");
	show_port(port4);
	
	system("pause");
}

void set_port1(void) {
	system("cls");
	printf("---设置PORT1端口---\n");
	
	printf("请输入端口名称: ");
	scanf("%s", port1.name);
	
	printf("请输入端口的状态:[0:禁止] [1:激活] ");
	scanf("%d", &port1.status);
	
	printf("请输入端口的类型:[LAN 或 WAN] ");
	scanf("%s", port1.type);
	
	printf("请输入端口的IP地址: ");
	scanf("%s", port1.ip);
	
	system("pause");
}

void set_port2(void) {
	system("cls");
	printf("---设置PORT2端口---\n");
	
	printf("请输入端口名称: ");
	scanf("%s", port2.name);
	
	printf("请输入端口的状态:[0:禁止] [1:激活] ");
	scanf("%d", &port2.status);
	
	printf("请输入端口的类型:[LAN 或 WAN] ");
	scanf("%s", port2.type);
	
	printf("请输入端口的IP地址: ");
	scanf("%s", port2.ip);
}

void set_port3(void) {
	system("cls");
	printf("---设置PORT3端口---\n");
	
	printf("请输入端口名称: ");
	scanf("%s", port3.name);
	
	printf("请输入端口的状态:[0:禁止] [1:激活] ");
	scanf("%d", &port3.status);
	
	printf("请输入端口的类型:[LAN 或 WAN] ");
	scanf("%s", port3.type);
	
	printf("请输入端口的IP地址: ");
	scanf("%s", port3.ip);
}

void set_port4(void) {
	system("cls");
	printf("---设置PORT4端口---\n");
	
	printf("请输入端口名称: ");
	scanf("%s", port4.name);
	
	printf("请输入端口的状态:[0:禁止] [1:激活] ");
	scanf("%d", &port4.status);
	
	printf("请输入端口的类型:[LAN 或 WAN] ");
	scanf("%s", port4.type);
	
	printf("请输入端口的IP地址: ");
	scanf("%s", port4.ip);
}

void set_port5(void) {
	system("cls");
	printf("---设置PORT5端口---\n");
	
	printf("请输入端口名称: ");
	scanf("%s", port5.name);
	
	printf("请输入端口的状态:[0:禁止] [1:激活] ");
	scanf("%d", &port5.status);
	
	printf("请输入端口的类型:[LAN 或 WAN] ");
	scanf("%s", port5.type);
	
	printf("请输入端口的IP地址: ");
	scanf("%s", port5.ip);
}

void set_ports(void) {
	char n;
	
	while(1) {
		system("cls");
		printf("---端口设置---\n");
		printf("1. PORT1\n");
		printf("2. PORT2\n");
		printf("3. PORT3\n");
		printf("4. PORT4\n");
		printf("5. PORT5\n");
		printf("6. 返回\n");
		printf("请选择: ");
		
		fflush(stdin);
		scanf("%c", &n);
		switch (n) {
		case '1':
			set_port1();
			break;
		case '2':
			set_port2();
			break;
		case '3':
			set_port3();
			break;
		case '4':
			set_port4();
			break;
		case '5':
			set_port5();
			break;
		case '6':
			return;
		default:
			input_error();
			break;
		} 
	}
	
}

项目精讲

1. 为什么要使用"结构"(结构体)

但需要表示一些复制信息时,使用单纯的数据类型很不方便。


比如:学生信息(学号,姓名,班级,电话,年龄)


2. 什么是"结构"

结构,就是程序员自定义的一种"数据类型"

是使用多个基本数据类型、或者其他结构,组合而成的一种新的"数据类型"。


3. 结构的定义

struct 结构名 {

成员类型 成员名;

成员类型 成员名;

};


实例:

struct  student {
   char  name[16];
   int   age;
   char  tel[12];
};

特别注意:

1) 要以struct开头

2) 最后要使用分号

3) 各成员之间用分号隔开

4. 结构的初始化

demo

#include <stdio.h>

struct student {
	char name[16];
	int age;
};

int main(void) {
	struct student s1 = {
		"Rock", 38
	};
	
	struct student s2 = {
		.age = 100,
		.name = "张三丰"
	};
	
	struct student s3;
	s3.age = 40;
	strcpy(s3.name, "杨过");
	
	printf("%s, %d\n", s1.name, s1.age);
	printf("%s, %d\n", s2.name, s2.age);
	printf("%s, %d\n", s3.name, s3.age);
	return 0;
}

5. 结构的使用

// 定义结构体变量
// 注意:完整的类型名称是  struct  student 
//       而不只是student
struct  student  s1,s2;
struct  student  s3;

scanf(“%s”,  s1.name);
s1.name = 25;   

s2 = s1;  //结构体变量之间可以直接赋值

使用形式:

结构体变量.成员变量

中间用 . 分隔


6. 使用结构体作为函数参数

#include <stdio.h>
#include <string.h>

struct  student {
   char  name[16];
   int   age;
   char  tel[12];
};

void work(struct student stu) {
	stu.age++;
	printf("%s,%d\n", stu.name, stu.age);
}

int main(void) {
	struct student s;
	
	strcpy(s.name, "Rock");
	s.age = 38;
	
	work(s); //结构体变量s作为函数参数,并不会改变s本身的值
	printf("%s,%d\n", s.name, s.age);
	
	return 0;
}

注意:

一般不建议把结构体直接作为函数参数。

因为结构体的size比较大,直接传递,消耗性能!

解决方案(使用指针)

7. 全局变量、局部变量

test1.c

#include <stdio.h>

void east_travel(void);

char master[16] = "女娲";

void west_travel(void) {
	char master[16] = "唐僧";
	printf("[西游]老大是: %s\n", master);
}

int main(void) {
	char master[16] = "如来佛祖";
	
	printf("[main]老大是: %s\n", master);
		
	char c;
	printf("是否进入女儿国? (Y或N)\n");
	fflush(stdin);
	scanf("%c", &c);
	if (c=='Y' || c=='y') {
		char master[16] = "女王";
		printf("[main-女儿国]老大是: %s\n", master);
	}
	
	printf("[main]老大是: %s\n", master);
	
	east_travel();
	return 0;
}

test2.c

#include <stdio.h>

extern char master[16];  //不能初始化!表示这个全局变量是在其他文件中定义的!

void east_travel(void) {
	printf("[东游]老大是: %s\n", master);
}

gcc test1.c test2.c


项目练习

练习1

独立实现项目10

练习2

1. 定义一个结构,用来描述一个游戏角色的基本信息。

该角色信息有,名称,性别,武力值

并让用户输入1个角色。

运行效果如下:

参考代码:

#include <stdio.h>

struct role {
	char name[32];
	char sex; //'M':男  'W':女 
	int power; 
};

int main(void) {
	struct role  r1, r2;
	
	printf("请输入角色的名称: ");
	scanf("%s", r1.name);
	
	fflush(stdin);
	printf("请输入角色的性别: ");
	scanf("%c", &r1.sex);
	
	printf("请输入角色的武力值: ");
	scanf("%d", &r1.power);
	
	printf("\n===角色设定===\n");
	printf("姓名: %s\n", r1.name);
	printf("性别:%c\n", r1.sex);
	printf("武力值:%d\n", r1.power);
	
	return 0;
}
原文链接:,转发请注明来源!