C语言数组和字符串笔记

news2025/4/8 13:36:16

C语言数组和字符串笔记

1. 数组及其相关概念

1.1 为什么需要使用数组?

数组是一个有序的、类型相同的数据集合。这些数据被称为数组的元素。每个数组都有一个名字,数组名代表数组的起始地址。数组的元素通过索引或下标访问,索引从0开始。

1.2 数组的定义

在使用数组之前,必须先定义数组。数组的定义包括以下几个部分:

  • 存储类型(如 int, char 等)
  • 数据类型(数组元素的类型)
  • 数组名(数组的标识符)
  • 数组大小(数组元素的个数)
数组定义语法:
存储类型 数据类型 数组名[数组长度];

例如:

int player[11];
数组的规范:
  • 数组的元素必须具有相同的数据类型。
  • 数组的元素可以通过下标访问,下标是从0开始的。
  • 数组的下标可以使用整型表达式,如 array[3+2]

2. 数组的存储方式

2.1 一维数组的存放方式

在内存中,一维数组的元素是连续存放的,每个元素占用的字节数与数据类型的字节数相同。

例如,定义一个浮点型数组 float mark[100];,每个元素占用4个字节。数组的存储形式如下:

text 低地址         高地址
mark[0]  mark[1]  mark[2] ... mark[99]

2.2 数组初始化

  • 数组初始化是在定义时给数组的元素赋初值。
  • 可以给部分元素赋值,未赋值的元素将自动初始化为0。
初始化语法:
类型 数组名[常量表达式] = {1,2, ..., 值n};
示例:
int ary[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

2.3 初始化的规则

  • 如果初始化数据个数少于数组长度,未初始化的元素会被自动赋值为0。
  • 如果初始化数据个数多于数组长度,编译器会报错。
  • 数组长度可以隐式指定。
示例:
int ary1[] = {1, 2, 3, 4, 5};  // 数组长度自动为5

3. 二维数组

3.1 二维数组的定义

二维数组可以看作是由多个一维数组组成的数组,通常表示一个矩阵或表格。二维数组的声明如下:

数据类型 数组名[行数][列数];
示例:
int temp[4][3];  // 定义一个 4 行 3 列的二维数组

3.2 二维数组初始化

可以使用不同的方式初始化二维数组:

示例:
int a[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};

3.3 二维数组的访问

二维数组的元素可以通过行和列的下标访问。例如,访问 a[1][2] 就是访问二维数组中第二行第三列的元素。

3.4 矩阵转置示例

#include <stdio.h>
#define MAX_ROW 2
#define MAX_COL 3

void main() {
    int a[MAX_ROW][MAX_COL] = {{1, 2, 3}, {4, 5, 6}};
    int b[MAX_COL][MAX_ROW];
    
    // 矩阵转置
    for (int i = 0; i < MAX_ROW; i++) {
        for (int j = 0; j < MAX_COL; j++) {
            b[j][i] = a[i][j];
        }
    }
    
    // 输出转置后的矩阵
    for (int i = 0; i < MAX_COL; i++) {
        for (int j = 0; j < MAX_ROW; j++) {
            printf("%4d", b[i][j]);
        }
        putchar('\n');
    }
}

4. 字符数组和字符串

4.1 字符串常量

字符串常量是由双引号括起来的字符序列。例如,字符串 "hello" 在内存中的存储方式如下:

h e l l o \0

其中,'\0' 是字符串的结束符。

4.2 字符数组与字符串

C语言没有专门的字符串类型,字符串是通过字符数组来实现的。字符数组用于存储一个字符串,二维字符数组用于存储多个字符串。

字符串数组定义示例:
char str[10];  // 声明一个字符数组,最多存储9个字符+结束符

4.3 字符串的初始化

  • 字符串初始化时,C语言会自动在字符串末尾添加一个 '\0' 作为结束符。
示例:
char str[6] = "hello";  // 自动在末尾加上 '\0'

4.4 字符串的使用

字符数组也可以像普通数组一样使用,通过下标访问和修改字符数组的元素。

char str[6] = "hello";
str[0] = 'H';  // 修改字符串的第一个字符

5. 字符串输入输出操作

5.1 输入字符串

使用 scanf 函数来输入字符串,使用 %s 格式说明符:

char str[100];
scanf("%s", str);  // 输入字符串

5.2 输出字符串

使用 printf 函数输出字符串,使用 %s 格式说明符:

printf("%s", str);  // 输出字符串

5.3 getsputs 函数

  • gets:用于从标准输入获取字符串,直到遇到换行符。
  • puts:用于输出字符串,并自动换行。

5.4 sprintf 函数

sprintf 将格式化的字符串输出到字符数组中。常用于将数值转换为字符串。

char buffer[100];
int num = 10;
sprintf(buffer, "Number is: %d", num);  // 将整数格式化为字符串

6. 字符串处理函数

6.1 strlen 函数

用于计算字符串的长度,不包括字符串的结束符 '\0'

int len = strlen(str);

6.2 strcpy 函数

将一个字符串复制到另一个字符串。

strcpy(dest, source);

6.3 strcat 函数

将两个字符串连接起来。

strcat(dest, source);

6.4 strcmp 函数

比较两个字符串,返回值说明:

  • 返回值小于0:str1 < str2
  • 返回值等于0:str1 == str2
  • 返回值大于0:str1 > str2
int result = strcmp(str1, str2);

6.5 strchrstrstr 函数

  • strchr:查找一个字符在字符串中第一次出现的位置。
  • strstr:查找一个子字符串在另一个字符串中的位置。
 char *ptr = strchr(str, 'a');  // 查找字符 'a'
char *ptr = strstr(str, "abc");  // 查找子字符串 "abc"

7. C语言中的字符函数

7.1 头文件 ctype.h

  • isalnum:检查是否为字母或数字。
  • isalpha:检查是否为字母。
  • isdigit:检查是否为数字。
  • islower:检查是否为小写字母。
  • isupper:检查是否为大写字母。
  • isspace:检查是否为空白字符。

8. 类型转换函数

8.1 头文件 stdlib.h

  • atof:将字符串转换为浮点型。
  • atoi:将字符串转换为整型。
  • atol:将字符串转换为长整型。
double num = atof("3.14");
int x = atoi("123");
long y = atol("123456");

9. C语言数组案例

第一个案例是经典冒泡排序,第二个 ==“小”==案例是简易五子棋,但是用各种符号设置棋盘,下棋时,棋盘总是会发生改动,我尝试修改多次,都无法解决这个问题,最终替换掉了所有的符号,只用“ . ” 来显示,打印棋盘时加入判断,每落一次棋子,其实相当于打印了一次棋盘,将原有的“ . ”替换为白子或者黑子。可以完美解决棋盘动的问题,当然,也尝试加入边框,但是这个时候就不是下在交叉线上了,而是框里。本来想着随机落子就行,后来想弄高级一点,就查了查资料,用了Alpha-Beta算法来优化计算机落子。(反正用鸡皮提改了又改,最后反正能跑了)。拒不承认输了一次。

修改前:

img

img

img

解决后:

img

img

9.1 五子棋源码

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

#define SIZE 15  // 棋盘大小
#define DEPTH 4  // 搜索深度
#define EMPTY 0
#define BLACK 1
#define WHITE 2

// 函数声明
void printBoard();
int isValidPos(int x, int y);
int evaluatePosition(int x, int y, int player);
void findBestMove(int player, int *bestX, int *bestY);
void playerMove(int player);
void aiMove(int player);
int checkWin(int x, int y, int player);
int checkDraw();
void playGomoku();

int lastMoveX = -1, lastMoveY = -1;  // 全局变量,用于记录最后落子位置


// 方向数组
const int dx[] = {1, 0, 1, 1};
const int dy[] = {0, 1, 1, -1};

// 棋盘状态
int board[SIZE][SIZE] = {0};

int main() 
{
	int choice;
    
    while(1) 
	{
        printf("\n==== 主菜单 ====\n");
        printf("1. 数组排序\n");
        printf("2. 五子棋游戏\n");
        printf("0. 退出程序\n");
        printf("请输入选择: ");
        
        scanf("%d",&choice);
        
        switch(choice) {
            case 1:
                bubbleSort();
                break;
            case 2:
            	playGomoku();
            	break;
            case 0:
                printf("程序已退出\n");
                return 0;
            default:
                printf("无效选择,请重试\n");
        }
    }
	
	return 0;
}

void bubbleSort()
{
	int arr[5];
	int count = 0;
	int temp;
	int i;
	int j;
	char ch;  // 用于清理缓冲区
	
	printf("请输入5个整数:\n");
	for(i = 0;i < 5;i++)
	{
		printf("请输入第%d个数: ", i + 1); 
		if(scanf("%d", &arr[i]) == 1)
		{
			count++;
		}else
		{
			printf("输入有误!程序结束!\n");
		    while((ch = getchar()) != '\n');
			return;
		}
	}
	
	for(i = 0; i < 5; i++)
	{
		for(j = 0; j < 4 - i; j++)
		{
			if(arr[j] > arr[j+1])
			{
				temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;				
			}
		}
	}
	printf("\n从小到大排序后的结果:\n");
	for(j = 0;j < 5; j++)
	{
		printf("%d ", arr[j]);
	}	
	
}

// 打印棋盘
void printBoard() {
    int i, j;
    
    // 打印多个换行来分隔
    printf("\n\n");
    
    // 打印列标号,确保与点位对齐
    printf("     ");  // 缩进5个空格,与行号对齐
    for(i = 1; i <= SIZE; i++) {
        printf("%2d  ", i);  // 统一使用2字符宽度,后加2空格
    }
    printf("\n\n");

    // 打印主棋盘
    for(i = 0; i < SIZE; i++) {
        // 打印行号,保持对齐
        printf("%2d   ", i + 1);  // 统一使用2字符宽度,后加3空格
            
        // 打印每一行的内容
        for(j = 0; j < SIZE; j++) {
            if(board[i][j] == BLACK)
                printf("●  ");    // 黑子后加2个空格
            else if(board[i][j] == WHITE)
                printf("○  ");    // 白子后加2个空格
            else
                printf("·  ");    // 空位点后加2个空格
        }
        printf("\n\n");  // 每行后打印一个空行
    }
    
    printf("\n请输入落子位置 (行 列): ");
}


// 检查位置是否有效
int isValidPos(int x, int y) {
    return x >= 0 && x < SIZE && y >= 0 && y < SIZE;
}

// 简化的位置评估函数
int evaluatePosition(int x, int y, int player) {
    int score = 0;
    int opponent = 3 - player;
    int d, count, empty, block;
    int nx, ny;
    
    // 检查四个方向
    for(d = 0; d < 4; d++) {
        count = 1;
        empty = 0;
        block = 0;
        
        // 正向检查
        nx = x + dx[d];
        ny = y + dy[d];
        while(isValidPos(nx, ny)) {
            if(board[nx][ny] == player) count++;
            else if(board[nx][ny] == EMPTY) {
                empty++;
                break;
            }
            else {
                block++;
                break;
            }
            nx += dx[d];
            ny += dy[d];
        }
        
        // 反向检查
        nx = x - dx[d];
        ny = y - dy[d];
        while(isValidPos(nx, ny)) {
            if(board[nx][ny] == player) count++;
            else if(board[nx][ny] == EMPTY) {
                empty++;
                break;
            }
            else {
                block++;
                break;
            }
            nx -= dx[d];
            ny -= dy[d];
        }
        
        // 评分规则
        if(count >= 5) score += 100000;
        else if(count == 4) {
            if(empty == 2) score += 10000;  // 活四
            else if(empty == 1) score += 1000;  // 冲四
        }
        else if(count == 3) {
            if(empty == 2) score += 1000;  // 活三
            else if(empty == 1) score += 100;  // 眠三
        }
    }
    return score;
}

// 找出最佳落子位置
void findBestMove(int player, int *bestX, int *bestY) {
    int maxScore = -1;
    int i, j, di, dj, ni, nj;
    int hasNeighbor;
    int score;
    *bestX = SIZE/2;
    *bestY = SIZE/2;
    
    // 只考虑已有棋子周围的空位
    for(i = 0; i < SIZE; i++) {
        for(j = 0; j < SIZE; j++) {
            if(board[i][j] != EMPTY) continue;
            
            // 检查是否有相邻的棋子
            hasNeighbor = 0;
            for(di = -1; di <= 1; di++) {
                for(dj = -1; dj <= 1; dj++) {
                    if(di == 0 && dj == 0) continue;
                    ni = i + di;
                    nj = j + dj;
                    if(isValidPos(ni, nj) && board[ni][nj] != EMPTY) {
                        hasNeighbor = 1;
                        break;
                    }
                }
                if(hasNeighbor) break;
            }
            
            if(!hasNeighbor) continue;
            
            score = evaluatePosition(i, j, player);
            // 考虑防守对手
            score += evaluatePosition(i, j, 3-player) * 0.8;
            
            if(score > maxScore) {
                maxScore = score;
                *bestX = i;
                *bestY = j;
            }
        }
    }
}



// 检查平局
int checkDraw() {
    int i, j;
    for(i = 0; i < SIZE; i++) {
        for(j = 0; j < SIZE; j++) {
            if(board[i][j] == EMPTY) return 0;
        }
    }
    return 1;
}

// 玩家落子
void playerMove(int player) {
    int x, y;
    while(1) {
        printf("请输入落子位置 (行 列): ");
        scanf("%d %d", &x, &y);
        x--; y--;  // 转换为数组索引
        if(isValidPos(x, y) && board[x][y] == EMPTY) {
            board[x][y] = player;
            lastMoveX = x;    // 记录最后落子位置
            lastMoveY = y;
            break;
        }
        printf("无效位置,请重试!\n");
    }
}

// 电脑落子
void aiMove(int player) {
    printf("电脑正在思考...\n");
    int bestX, bestY;
    findBestMove(player, &bestX, &bestY);
    board[bestX][bestY] = player;
    lastMoveX = bestX;    // 记录最后落子位置
    lastMoveY = bestY;
    printf("电脑落子位置:%d %d\n", bestX + 1, bestY + 1);
}

// 检查获胜
int checkWin(int x, int y, int player) {
    if(x < 0 || y < 0) return 0;  // 添加边界检查
    
    int d, count;
    int nx, ny;
    for(d = 0; d < 4; d++) {
        count = 1;
        
        // 正向检查
        nx = x + dx[d];
        ny = y + dy[d];
        while(isValidPos(nx, ny) && board[nx][ny] == player) {
            count++;
            nx += dx[d];
            ny += dy[d];
        }
        
        // 反向检查
        nx = x - dx[d];
        ny = y - dy[d];
        while(isValidPos(nx, ny) && board[nx][ny] == player) {
            count++;
            nx -= dx[d];
            ny -= dy[d];
        }
        
        if(count >= 5) return 1;
    }
    return 0;
}

// 游戏主循环
void playGomoku() {
    int currentPlayer = BLACK;
    int gameOver = 0;
    int i, j;
    
    // 重置最后落子位置
    lastMoveX = -1;
    lastMoveY = -1;
    
    // 初始化棋盘
    for(i = 0; i < SIZE; i++) {
        for(j = 0; j < SIZE; j++) {
            board[i][j] = EMPTY;
        }
    }
    
    printf("\n=== 五子棋游戏 ===\n");
    printf("您执黑子(●),电脑执白子(○)\n");
    printf("请输入落子位置的行号和列号(1-%d)\n\n", SIZE);
    
    while(!gameOver) {
        printBoard();
        
        if(currentPlayer == BLACK) {
            playerMove(currentPlayer);
        } else {
            aiMove(currentPlayer);
        }
        
        // 立即检查胜负
        if(checkWin(lastMoveX, lastMoveY, currentPlayer)) {
            printBoard();
            printf("\n%s胜利!\n", currentPlayer == BLACK ? "玩家" : "电脑");
            gameOver = 1;
            continue;  // 直接结束游戏
        }
        
        if(checkDraw()) {
            printBoard();
            printf("\n游戏平局!\n");
            gameOver = 1;
            continue;
        }
        
        currentPlayer = 3 - currentPlayer;  // 切换玩家
    }
    
    // 游戏结束后等待用户确认
    printf("\n按Enter键返回主菜单...");
    getchar();
    getchar();

接下来这个版本的五子棋,是简化版本的,棋盘更专业,同时可以落子到交叉点,但是计算机室随机落子的,没有用任何算法,最最最简单的。

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>

#define SIZE 15  // 棋盘大小

int board[SIZE][SIZE] = {0};  // 0表示空位,1表示玩家,2表示电脑

void gotoxy(int x, int y) {
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD pos;
    pos.X = x;
    pos.Y = y;
    SetConsoleCursorPosition(handle, pos);
}

void initBoard() {
    int i, j;
    system("cls");
    
    // 打印列号,确保对齐
    printf("    ");  // 为行号留出空间
    for(i = 1; i <= SIZE; i++) {
        printf("%-2d  ", i);
    }
    printf("\n");
    
    // 打印第一行(上边框)
    printf("   ┌");
    for(j = 0; j < SIZE-2; j++) {
        printf("───┬");
    }
    printf("───┐\n");
    
    // 打印中间的行
    for(i = 1; i <= SIZE; i++) {
        printf("%2d │", i);  // 行号对齐
        for(j = 0; j < SIZE-2; j++) {
            printf("   │");
        }
        printf("   │");

        if(i < SIZE) {
            printf("\n   ├");
            for(j = 0; j < SIZE-2; j++) {
                printf("───┼");
            }
            printf("───┤");
        }
        printf("\n");
    }
    
    gotoxy(0, SIZE * 2 + 4);  // 确保光标移动到棋盘下方
    printf("玩家: ● 电脑: ○\n");
    gotoxy(0, SIZE * 2 + 6);
}

void placePiece(int x, int y, int player) {
    // 计算屏幕坐标(考虑边框和行号)
    int screenX = (y - 1) * 4 + 3;  // 每列占4个字符,列号从第3个字符开始
    int screenY = (x - 1) * 2 + 1;  // 每行占2个字符,行号从第1个字符开始
    
    gotoxy(screenX, screenY);
    if(player == 1) {
        printf("●");
    } else {
        printf("○");
    }
    
    // 移动光标到棋盘下方提示区域
    gotoxy(0, SIZE * 2 + 6);
}

int checkWin(int player) {
    int i, j, k;
    // 检查行
    for(i = 0; i < SIZE; i++) {
        for(j = 0; j <= SIZE - 5; j++) {
            int count = 0;
            for(k = 0; k < 5; k++) {
                if(board[i][j + k] == player) count++;
            }
            if(count == 5) return 1;
        }
    }

    // 检查列
    for(i = 0; i <= SIZE - 5; i++) {
        for(j = 0; j < SIZE; j++) {
            int count = 0;
            for(k = 0; k < 5; k++) {
                if(board[i + k][j] == player) count++;
            }
            if(count == 5) return 1;
        }
    }

    // 检查主对角线
    for(i = 0; i <= SIZE - 5; i++) {
        for(j = 0; j <= SIZE - 5; j++) {
            int count = 0;
            for(k = 0; k < 5; k++) {
                if(board[i + k][j + k] == player) count++;
            }
            if(count == 5) return 1;
        }
    }

    // 检查副对角线
    for(i = 0; i <= SIZE - 5; i++) {
        for(j = 4; j < SIZE; j++) {
            int count = 0;
            for(k = 0; k < 5; k++) {
                if(board[i + k][j - k] == player) count++;
            }
            if(count == 5) return 1;
        }
    }

    return 0;
}

void playerMove() {
    int x, y;
    while(1) {
        gotoxy(0, SIZE * 2 + 6);
        printf("                                                      \r"); // 清空整行
        printf("请输入落子位置(行 列):                        "); // 提留足够空格
        gotoxy(25, SIZE * 2 + 6); // 光标移到输入位置,确保在提示后方
        scanf("%d %d", &x, &y);
        x--; y--;
        
        if(x >= 0 && x < SIZE && y >= 0 && y < SIZE && board[x][y] == 0) {
            board[x][y] = 1;
            placePiece(x+1, y+1, 1);
            break;
        }
        gotoxy(0, SIZE * 2 + 7);
        printf("该位置不能落子,请重试!                \n");
    }
}

void computerMove() {
    int x, y;
    gotoxy(0, SIZE * 2 + 7);
    printf("                                                      \r"); // 清空整行
    printf("电脑思考中...                        \n");
    Sleep(800);
    
    while(1) {
        x = rand() % SIZE;
        y = rand() % SIZE;
        if(board[x][y] == 0) {
            board[x][y] = 2;
            placePiece(x+1, y+1, 2);
            gotoxy(0, SIZE * 2 + 7);
            printf("                                                      \r"); // 清空整行
            printf("电脑落子位置: %d %d                \n", x + 1, y + 1);
            break;
        }
    }
}

int main() {
    int turn = 0;
    
    SetConsoleTitle("五子棋");
    srand(time(NULL));
    
    initBoard();
    
    while(1) {
        if(turn % 2 == 0) {
            gotoxy(0, SIZE * 2 + 6);
            printf("                                                      \r"); // 清空整行
            printf("轮到您落子                        \n");
            playerMove();
            if(checkWin(1)) {
                gotoxy(0, SIZE * 2 + 8);
                printf("恭喜您获胜!\n");
                break;
            }
        } else {
            gotoxy(0, SIZE * 2 + 6);
            printf("                                                      \r"); // 清空整行
            printf("轮到电脑落子                        \n");
            computerMove();
            if(checkWin(2)) {
                gotoxy(0, SIZE * 2 + 8);
                printf("很遗憾,电脑获胜!\n");
                break;
            }
        }
        
        turn++;
        if(turn == SIZE * SIZE) {
            gotoxy(0, SIZE * 2 + 8);
            printf("棋盘已满,游戏结束!\n");
            break;
        }
    }
    
    printf("按回车键退出...");
    getchar();
    getchar();
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2259509.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

u-boot移植、配置、编译学习笔记【刚开始就中止了】

教程视频地址 https://www.bilibili.com/video/BV1L24y187cK 【这个视频中途停更了…原因是实际中需要去改u-boot的情况比较少】 使用的u-boot的源码 视频中使用的是 u-boot-2017.03 学习到这里&#xff0c;暂停u-boot的移植、配置、编译学习&#xff0c;原因是经过与老师…

回归任务与分类任务应用及评价指标

能源系统中的回归任务与分类任务应用及评价指标 一、回归任务应用1.1 能源系统中的回归任务应用1.1.1 能源消耗预测1.1.2 负荷预测1.1.3 电池健康状态估计&#xff08;SOH预测&#xff09;1.1.4 太阳能发电量预测1.1.5 风能发电量预测 1.2 回归任务中的评价指标1.2.1 RMSE&…

【树莓派4B】MindSpore lite 部署demo

一个demo&#xff0c;mindspore lite 部署在树莓派4B ubuntu22.04中&#xff0c;为后续操作开个门&#xff01; 环境 开发环境&#xff1a;wsl-ubuntu22.04分发版部署环境&#xff1a;树莓派4B&#xff0c;操作系统为ubuntu22.04mindspore lite版本&#xff1a;mindspore-li…

AI监控赋能健身馆与游泳馆全方位守护,提升安全效率

一、AI视频监控技术的崛起 随着人工智能技术的不断发展&#xff0c;AI视频监控正成为各行业保障安全、提升效率的关键工具。相比传统监控系统&#xff0c;AI技术赋予监控系统实时分析、智能识别和精准预警的能力&#xff0c;让“被动监视”转变为“主动防控”。 二、AI监控应用…

M|林中小屋

title: 林中小屋 The Cabin in the Woods time: 2024-12-13 周五 rating: 7 豆瓣: 7.6 上映时间: “2012” 类型: M恐怖 导演: 德鲁戈达德 Drew Goddard 主演: 克里斯汀康奈利 Kristen Connolly弗兰克朗茨 Fran Kranz 国家/地区: 美国 片长/分钟: 95分钟 M&#xff5…

Mysql中的sql语句怎么执行的?

1.连接MySQL 通过客户端使用TCP&#xff08;数据传输协议&#xff09;连接MySQL连接器&#xff0c;连接器接到请求后对它进行检验是否有权限&#xff0c;有就进行分配资源。&#xff08;这个过程不能超过8小时&#xff09; 2.成功连接(校验效验) 客户端发送sql语句&#xff…

流网络复习笔记

所以这里的19是118-019 <s , w> 1/3就是容量是3&#xff0c;流量是1 残留网络就是两个相对箭头上都是剩余对应方向还能同行的流量 所以s->w 3-1 2, w->s 1

Redis - 实战之 全局 ID 生成器 RedisIdWorker

概述 定义&#xff1a;一种分布式系统下用来生成全局唯一 ID 的工具 特点 唯一性&#xff0c;满足优惠券需要唯一的 ID 标识用于核销高可用&#xff0c;随时能够生成正确的 ID高性能&#xff0c;生成 ID 的速度很快递增性&#xff0c;生成的 ID 是逐渐变大的&#xff0c;有利于…

arXiv-2024 | VLM-GroNav: 基于物理对齐映射视觉语言模型的户外环境机器人导航

作者&#xff1a; Mohamed Elnoor, Kasun Weerakoon, Gershom Seneviratne, Ruiqi Xian, Tianrui Guan, Mohamed Khalid M Jaffar, Vignesh Rajagopal, and Dinesh Manocha单位&#xff1a;马里兰大学学院公园分校原文链接&#xff1a;VLM-GroNav: Robot Navigation Using Phys…

华为无线AC、AP模式与上线解析(Huawei Wireless AC, AP Mode and Online Analysis)

华为无线AC、AP模式与上线解析 为了实现fit 瘦AP的集中式管理&#xff0c;我们需要统一把局域网内的所有AP上线到AC&#xff0c;由AC做集中式管理部署。这里我们需要理解CAPWAP协议&#xff0c;该协议分为两种报文&#xff1a;1、管理报文 2、数据报文。管理报文实际在抓包过程…

简单vue3前端打包部署到服务器,动态配置http请求头后端ip方法教程

vue3若依框架前端打包部署到服务器&#xff0c;需要部署到多个服务器上&#xff0c;每次打包会很麻烦&#xff0c;今天教大家一个动态配置请求头api的方法&#xff0c;部署后能动态获取(修改)对应服务器的请求ip 介绍两种方法&#xff0c;如有需要可以直接尝试步骤一&#xff…

Java-DataX 插件机制示例

示例代码 DataXPluginExample: DataX 项目的plugin 机制学习https://gitee.com/wendgit/data-xplugin-example/ 摘要 DataXPluginExample 是一个我编写的专门解读DataX插件机制的示例项目&#xff0c;旨在深入解析和掌握DataX的插件机制。本示例通过简洁明了的实现方式&#…

基于AI网关的风电系统在线监测

风力发电是典型的清洁能源之一&#xff0c;也是我国能源结构转型的重要组成。近年来我国大力发展风能、水能、光伏等清洁能源&#xff0c;加快创造人与生态友好和谐的人居社会。由于风电机组通常部署于偏远的野外&#xff0c;经常面临狂风、暴雨、日晒等严苛工作形势&#xff0…

[Unity] Text文本首行缩进两个字符

Text文本首行缩进两个字符的方法比较简单。通过代码把"\u3000\u3000"加到文本字符串前面即可。 比如&#xff1a; 效果&#xff1a; 代码&#xff1a; TMPtext1.text "\u3000\u3000" "选择动作类型&#xff1a;";

实时日志与发展:Elasticsearch 推出全新专用的 logsdb 索引模式

作者&#xff1a;来自 Elastic Mark Settle, George Kobar 及 Amena Siddiqi Elastic 最新发布的 logsdb 索引模式是专为日志管理优化的功能&#xff0c;旨在提升日志数据的存储效率、查询性能以及整体可用性。这个模式专注于满足现代日志处理需求&#xff0c;提供更高效的日志…

可视化报表如何制作?一文详解如何用报表工具开发可视化报表

在如今这个数据驱动的商业时代&#xff0c;众多企业正如火如荼地推进数字化转型&#xff0c;力求在激烈的市场竞争中占据先机。然而&#xff0c;随着业务规模的扩大和运营复杂度的提升&#xff0c;企业的数据量爆炸式增长&#xff0c;传统报表格式单一、信息呈现密集且不易解读…

在CentOS中安装和卸载mysql

在CentOS7中安装和卸载mysql 卸载mysql1、查看是否安装过mysql2、查看mysql服务状态3、关闭mysql服务4、卸载mysql相关的rpm程序5、删除mysql相关的文件6、删除mysql的配置文件my.cnf 安装mysql1、下载mysql相关的rpm程序2、检查/tmp临时目录权限3、安装mysql前的依赖检查3、安…

【EthIf-03】 EthernetInterface软件栈的文件组织结构

上图为《AUTOSAR_SWS_EthernetInterface【v2.2.0 】》给出的EthernetInterface软件栈的文件组织结构,本文主要关注arccore代码中已存在的文件的功能和作用,不知道的小伙伴可以查看🔗EthIf的文件结构中的src和inc目录下的文件有哪些: 1. 文件结构 1.1 EthIf_Cbk.h 头文…

Java基础知识(四) -- 面向对象(上)

1.概述 Java语言是一种面向对象的程序设计语言&#xff0c;而面向对象思想(OOP)是一种程序设计思想&#xff0c;在面向对象思想的指引下&#xff0c;使用Java语言去设计、开发计算机程序。这里的对象泛指现实中一切事物&#xff0c;每种事物都具备自己的属性和行为。 面向对象思…

国内Chrome浏览器下载安装教程,谷歌浏览器最新下载教程

今天主要讲解的是国内Chrome浏览器下载安装教程&#xff0c;谷歌浏览器最新下载教程&#xff0c;包括确认浏览器版本、ChromeDriver 驱动的下载&#xff0c;同理&#xff0c;这个教程同样适用于windows版本的&#xff0c;linux 版本的&#xff0c; mac 版本的。 众所周知&…