C语言第14节:字符函数和字符串函数

news2024/12/4 1:49:55

1. 字符分类函数

C语言中有一系列的函数是专门做字符分类的,也就是一个字符是属于什么类型的字符的。这些函数的使用都需要包含一个头文件是<ctype.h>

<ctype.h>头文件中的字符分类函数提供了一组用于检查单个字符特性的函数。这些函数接收一个字符(通常为int类型的char值),返回布尔值(非零为真,零为假)。常用于处理用户输入或文本解析。

1.1 函数原理

字符分类函数通过ASCII码表定义字符范围。例如,isalpha判断是否是字母的逻辑是基于字符ASCII码是否位于大写字母(65-90)或小写字母(97-122)的范围内。

1.2 标准库实现的特点

  • 实现高效,直接使用位掩码或跳转表。
  • 通常硬件层面优化,比如ARM架构中会用单指令完成掩码操作。

1.3 用法

函数如果参数符号符合下列条件就返回真
iscntrl任何控制字符
isspace空白字符:空格 ' ',换页 '\f',换行 '\n',回车 '\r',制表符 '\t' 或者垂直制表符 '\v'
isdigit十进制数字 '0' ~ '9' 字符
isxdigit十六进制数字,包括所有十进制数字字符,小写字母 a~f,大写字母 A~F
islower小写字母 a~z
isupper大写字母 A~Z
isalpha字母 a~z 或 A~Z
isalnum字母或者数字 a~z, A~Z, 0~9
ispunct标点符号,任何不属于数字或者字母的图形字符(可打印)
isgraph任何图形字符
isprint任何可打印字符,包括图形字符和空白字符

这些函数的使用方法非常类似,我们就讲解一个函数的事情,其他的非常类似:

int islower ( int c );

islower 是能够判断参数部分的c 是否是小写字母的。

通过返回值来说明是否是小写字母,如果是小写字母就返回非0的整数,如果不是小写字母,则返回0。

1.4 使用示例

写一个代码,将字符串中的小写字母转大写,其他字符不变。

#include <stdio.h>
#include <ctype.h>

// 函数实现小写字母转大写
void toUppercase(char *str) {
    int i = 0;
    while (str[i] != '\0') {  // 遍历字符串
        if (islower(str[i])) {  // 判断是否是小写字母
            str[i] -= 32;  // 转换为大写字母
        }
        i++;
    }
}

int main() {
    char str[100];
    
    // 输入字符串
    printf("请输入一个字符串:");
    fgets(str, sizeof(str), stdin);  // 使用fgets以支持空格输入
    
    // 转换小写字母为大写
    toUppercase(str);
    
    // 输出转换后的字符串
    printf("转换后的字符串:%s", str);
    
    return 0;
}

输入:

Hello, World!

输出:

制换后的字符串:HELLO, WORLD!

2. 字符转换函数

2.1 toupper 函数

功能:将小写字母转换为对应的大写字母。如果字符不是小写字母,则返回原字符。

函数原型

int toupper(int c);

参数

  • c 是一个字符(通常以整数形式传递,如 char 类型值)。

返回值

  • 如果 c 是小写字母(‘a’ 到 ‘z’),返回其对应的大写字母;
  • 如果 c 不是小写字母,直接返回 c

示例

#include <stdio.h>
#include <ctype.h>

int main() {
    char ch = 'a';
    printf("toupper('%c') = '%c'\n", ch, toupper(ch)); 

    ch = 'A';
    printf("toupper('%c') = '%c'\n", ch, toupper(ch));  

    ch = '1';
    printf("toupper('%c') = '%c'\n", ch, toupper(ch));  

    return 0;
}

在这里插入图片描述


2.2 tolower 函数

功能:将大写字母转换为对应的小写字母。如果字符不是大写字母,则返回原字符。

函数原型

int tolower(int c);

参数和返回值:同 toupper,但作用于大写字母。

示例

#include <stdio.h>
#include <ctype.h>

int main() {
    char ch = 'A';
    printf("tolower('%c') = '%c'\n", ch, tolower(ch));  // 输出:tolower('A') = 'a'

    ch = 'a';
    printf("tolower('%c') = '%c'\n", ch, tolower(ch));  // 输出:tolower('a') = 'a'

    ch = '!';
    printf("tolower('%c') = '%c'\n", ch, tolower(ch));  // 输出:tolower('!') = '!'

    return 0;
}

在这里插入图片描述

3. strlen 的使用和模拟实现

size_t strlen ( const char * str );

3.1 函数原理

strlen通过指针遍历,寻找终止符\0,并计算字符个数。标准实现可能对齐内存块,通过字节操作实现性能优化。

3.2 标准库实现的特点

  • 在大多数平台上,strlen通过内存对齐和SIMD指令完成高效计算。
  • 一次性读取多个字节,通过掩码操作检测是否包含\0

3.3 注意事项

  • 字符串以'\0' 作为结束标志,strlen函数返回的是在字符串中'\0' 前面出现的字符个数(不包含'\0' )。若字符串未正确终止,可能导致越界读取。
  • 参数指向的字符串必须要以'\0' 结束。
  • 注意函数的返回值为 size_t,是无符号的(易错)
  • 在循环中多次调用strlen会带来性能问题,应将长度预存。
  • strlen的使用需要包含头文件<string.h>

3.4 模拟实现

3.4.1 方式1

//通过指针运算
#include <stdio.h>

size_t my_strlen(const char *str) {
    const char *ptr = str;
    while (*ptr != '\0') {
        ptr++;
    }
    return ptr - str;
}

int main() {
    char str[] = "I like KUST";
    printf("字符串长度: %zu\n", my_strlen(str));
    return 0;
}

在这里插入图片描述

3.4.2 方式2

#include <stdio.h>

//计数器方式
int my_strlen(const char * str)
{
	int count = 0;
	while(*str)
	{
		count++;
		str++;
	}
	return count;
}

int main() {
    char str[] = "I like KUST";
    printf("字符串长度: %zu\n", my_strlen(str));
    return 0;
}

在这里插入图片描述

3.4.3 方式3

#include <stdio.h>

//不能创建临时变量计数器,递归方式
int my_strlen(const char * str)
{
	if(*str == '\0')
		return 0;
	else
		return 1 + my_strlen(str+1);
}

int main() {
    char str[] = "I like KUST";
    printf("字符串长度: %zu\n", my_strlen(str));
    return 0;
}

在这里插入图片描述

4. strcpy的使用和模拟实现

char* strcpy(char * destination, constchar * source );

4.1 函数原理

strcpy逐字节将源字符串的内容复制到目标地址,最后加上终止符\0。标准实现可能使用内存块操作(如memcpy)加速。

4.2 标准库实现的特点

  • 不检查目标缓冲区大小,容易导致缓冲区溢出。
  • 通常通过CPU指令(如MOVS指令)实现批量拷贝。

4.3 注意事项

  • Copies the C string pointed by source into the array pointed by destination, including the terminating null character (and stopping at that point).
  • 源字符串必须以'\0' 结束。
  • 会将源字符串中的'\0' 拷贝到目标空间。
  • strcpy不会检查dest的大小,应确保目标空间必须足够大,以确保能存放源字符串。
  • 目标空间必须可修改。

4.4 模拟实现

#include <stdio.h>

char *my_strcpy(char *dest, const char *src) {
    char *ptr = dest;
    while ((*ptr++ = *src++) != '\0');
    return dest;
}

int main() {
    char src[] = "I like KUST";
    char dest[50];
    my_strcpy(dest, src);
    printf("复制后的字符串: %s\n", dest);
    return 0;
}

在这里插入图片描述

5.strcat 的使用和模拟实现

5.1 函数功能

strcat 函数用于将一个字符串连接到另一个字符串的末尾。它会覆盖目标字符串的末尾的 \0,然后追加源字符串内容,最后加上新的终止符 \0

5.2 函数声明

#include <string.h>
char *strcat(char *dest, const char *src);
  • dest:目标字符串,存放拼接结果。
  • src:源字符串,追加到目标字符串后。
  • 返回值:目标字符串 dest 的指针。

5.3 注意事项

  • 源字符串必须以'\0' 结束。
  • 目标字符串中也得有\0 ,否则没办法知道追加从哪里开始。
  • 目标空间必须有足够的大,能容纳下源字符串的内容。
  • 目标空间必须可修改。
  • 如果 src 是空字符串,则目标字符串不会发生任何变化。

5.3 使用示例

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

int main() {
    char str1[50] = "I like ";  // 确保str1有足够的空间存储拼接结果
    char str2[] = "KUST!";

    strcat(str1, str2);  // 将str2拼接到str1末尾

    printf("拼接结果: %s\n", str1);  // 输出拼接后的字符串
    return 0;
}

输出结果:

拼接结果: I like KUST!

5.4 模拟实现

可以通过指针操作手动实现 strcat,逐步找到目标字符串的末尾,并从末尾开始追加源字符串。

#include <stdio.h>

char *my_strcat(char *dest, const char*src)
{
	char *ret = dest;

	while(*dest)
	{
		dest++;
	}
	while((*dest++ = *src++));

	return ret;
}

int main() {
    char str1[100] = "I like ";
    char str2[] = "Kunming University of Science and Technology";
    
    my_strcat(str1, str2);
    printf("拼接结果: %s\n", str1);
    return 0;
}

输出结果:

拼接结果: I like Kunming University of Science and Technology

6. strcmp的使用和模拟实现

strcmp 是 C 语言 <string.h> 库中最常用的字符串比较函数之一,用于比较两个字符串的字典序大小。以下从函数功能、实现原理、标准用法、模拟实现、常见问题、注意事项和扩展应用等方面进行详细说明。


6.1 函数功能

strcmp 用于逐字符比较两个字符串的大小,其比较规则如下:

  • 如果字符串 str1 等于 str2,返回值为 0
  • 如果字符串 str1 小于 str2(基于ASCII码值),返回负值。
  • 如果字符串 str1 大于 str2(基于ASCII码值),返回正值。

6.2 函数声明

#include <string.h>
int strcmp(const char *str1, const char *str2);
  • 参数:
    • str1:第一个字符串的指针。
    • str2:第二个字符串的指针。
  • 返回值:
    • 0:两个字符串相等。
    • 正值:str1 的第一个不匹配字符大于 str2 对应字符。
    • 负值:str1 的第一个不匹配字符小于 str2 对应字符。

6.3 注意事项

  • This function starts comparing the first character of each string. If they are equal to each other, it continues with the following pairs until the characters differ or until a terminating null-character is reached.

  • strcmp 是区分大小写的。例如,"Apple""apple" 是不同的。

  • 空字符串的比较结果永远小于任何非空字符串。

  • 确保字符串以 \0 结尾,否则可能导致内存越界。

6.4 函数使用示例

以下示例比较两个字符串并根据返回值输出结果。

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

int main() {
    char str1[] = "apple";
    char str2[] = "banana";

    int result = strcmp(str1, str2);

    if (result == 0) {
        printf("两个字符串相等\n");
    } else if (result < 0) {
        printf("\"%s\" 小于 \"%s\"\n", str1, str2);
    } else {
        printf("\"%s\" 大于 \"%s\"\n", str1, str2);
    }

    return 0;
}

输出结果:

"apple" 小于 "banana"

6.5 实现原理

strcmp 的核心逻辑是:

  1. 逐字符比较两个字符串对应位置的字符。
  2. 如果找到不相同的字符,则返回它们的 ASCII 值差。
  3. 如果全部字符相等,返回 0

6.6 模拟实现

以下代码实现了 strcmp 的核心逻辑。

#include <stdio.h>

int my_strcmp (const char * str1, const char * str2)
{
	int ret = 0 ;
	while(*str1 == *str2)
	{
		if(*str1 == '\0')
			return 0;
		str1++;
		str2++;
	}
	return *str1-*str2;
}

int main() {
    char str1[] = "hello";
    char str2[] = "world";

    int result = my_strcmp(str1, str2);

    if (result == 0) {
        printf("两个字符串相等\n");
    } else if (result < 0) {
        printf("\"%s\" 小于 \"%s\"\n", str1, str2);
    } else {
        printf("\"%s\" 大于 \"%s\"\n", str1, str2);
    }

    return 0;
}

输出结果:

"hello" 小于 "world"

7. strncpy函数的使用

7.1 函数功能

strncpy 用于将一个字符串的指定长度字符复制到目标字符串。如果目标长度大于源字符串长度,会填充额外的空字符 \0。如果指定的复制长度小于源字符串的长度,则目标字符串可能不是一个以 '\0' 结尾的有效 C字符串,可能引发未定义行为。

7.2 函数声明

#include <string.h>
char *strncpy(char *dest, const char *src, size_t n);
  • dest:目标字符串。
  • src:源字符串。
  • n:要复制的最大字符数。
  • 返回值:返回目标字符串 dest

7.3 使用示例

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

int main() {
    char src[] = "I like KUST which is the best school in my heart";
    char dest[20];

    strncpy(dest, src, 11);
    dest[11] = '\0'; //手动添加终止符
    printf("目标字符串: %s\n", dest);

    return 0;
}

输出结果:

目标字符串: I like KUST

8. strncat函数的使用

8.1 函数功能

  • Appends the first num characters of source to destination, plus a terminating null-character.(将source指向字符串的前num个字符追加到destination指向的字符串末尾,再追加一个\0 字符)。
  • If the length of the C string in source is less than num, only the content up to the terminating null-character is copied.(如果source 指向的字符串的长度小于num的时候,只会将字符串中到\0 的内容追加到destination指向的字符串末尾)。

8.2 函数声明

#include <string.h>
char *strncat(char *dest, const char *src, size_t n);
  • dest:目标字符串,需有足够空间存储结果。
  • src:源字符串。
  • n:追加的最大字符数。
  • 返回值:目标字符串 dest

8.3 使用示例

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

int main() {
    char str1[20] = "I like ";
    char str2[] = "KUST is the best school in my heart";

    strncat(str1, str2, 4);  // 只追加3个字符
    printf("拼接结果: %s\n", str1);

    return 0;
}

输出结果:

拼接结果: I like KUST

9. strncmp函数的使用

9.1 函数功能

strncmp 用于比较两个字符串的前 n 个字符,并返回比较结果。

9.2 函数声明

#include <string.h>
int strncmp(const char *str1, const char *str2, size_t n);
  • str1str2:要比较的两个字符串。
  • n:比较的字符数。
  • 返回值:
    • 0:相等。
    • 正值:str1 大于 str2
    • 负值:str1 小于 str2

9.3 使用示例

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

int main() {
    char str1[] = "abcdef";
    char str2[] = "abcxyz";

    int result = strncmp(str1, str2, 3);

    if (result == 0) {
        printf("前3个字符相等\n");
    } else {
        printf("前3个字符不相等\n");
    }

    return 0;
}

输出结果:

3个字符相等

10. strstr的使用和模拟实现

strstr 是 C 标准库中一个非常有用的字符串操作函数,用于在一个字符串中查找子字符串的第一次出现。下面将详细解析 strstr 的功能、用法、原理、模拟实现、注意事项和扩展应用。


10.1 函数功能

  • strstr 用于在字符串 haystack 中查找子字符串 needle 的第一次出现,并返回指向该子字符串起始位置的指针。如果未找到,返回 NULL

  • Returns a pointer to the first occurrence of str2 in str1, or a null pointer if str2 is not part of str1.(函数返回字符串str2在字符串str1中第一次出现的位置)。

  • The matching process does not include the terminating null-characters, but it stops there.(字符串的比较匹配不包含\0 字符,以\0 作为结束标志)。


10.2 函数声明

#include <string.h>
char *strstr(const char *haystack, const char *needle);
  • 参数:
    • haystack:要搜索的目标字符串。
    • needle:要查找的子字符串。
  • 返回值:
    • 如果找到子字符串,返回其在 haystack 中的起始地址。
    • 如果未找到子字符串,返回 NULL
    • 如果 needle 为空字符串,则返回 haystack 的起始地址。

10.3 使用示例

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

int main() {
    char haystack[] = "Kunming University of Science and Technology Faculty of Information Engineering and Automation";
    char needle[] = "Technology";

    char *result = strstr(haystack, needle);

    if (result != NULL) 
    {
        printf("子字符串 \"%s\" 找到了,起始位置: %s\n", needle, result);
    } 
    else 
    {
        printf("子字符串 \"%s\" 未找到。\n", needle);
    }

    return 0;
}

输出结果:

子字符串 "Technology" 找到了,起始位置: Technology Faculty of Information Engineering and Automation

10.4 模拟实现

以下是 strstr 的核心逻辑模拟实现:

#include <stdio.h>

char * my_strstr (const char * str1, const char * str2)
{
    char *cp = (char *) str1;
    char *s1, *s2;
    if ( !*str2 )
        return((char *)str1);
    while (*cp)
    {
        s1 = cp;
        s2 = (char *) str2;
        while ( *s1 && *s2 && !(*s1-*s2) )
            s1++, s2++;
        if (!*s2)
            return(cp);
        cp++;
    }
    return(NULL);
}

int main() {
    char haystack[] = "Faculty of Information Engineering and Automation";
    char needle[] = "Information";

    char *result = my_strstr(haystack, needle);

    if (result != NULL) {
        printf("子字符串 \"%s\" 找到了,起始位置: %s\n", needle, result);
    } else {
        printf("子字符串 \"%s\" 未找到。\n", needle);
    }

    return 0;
}

输出:

子字符串 "Information" 找到了,起始位置: Information Engineering and Automation

10.5 注意事项

  • 如果 needle 是空字符串(""),则 strstr 返回 haystack 的起始位置。

  • strstr 是大小写敏感的。如果需要忽略大小写,可以结合 tolowertoupper 函数对字符进行预处理。

11. strtok函数的使用

strtok 是 C 标准库中的字符串处理函数,用于将字符串分割为多个子字符串(token),以指定的分隔符为分割依据。


11.1 函数功能

strtok 用于将字符串分割为一个个子字符串,分隔符由用户指定。每次调用 strtok 会返回字符串中的下一个子字符串,并用 NULL 标记字符串的结束。


11.2 函数声明

#include <string.h>
char *strtok(char *str, const char *delim);
  • 参数:
    • str:待分割的字符串(首次调用时提供整个字符串,之后传入 NULL 表示接着上次的位置继续分割)。
    • delim:分隔符字符串(可包含多个字符)。
  • 返回值:
    • 如果找到子字符串,则返回指向该子字符串的指针。
    • 如果字符串分割完成或找不到分隔符,则返回 NULL

11.3 注意事项

  • delim参数指向一个字符串,定义了用作分隔符的字符集合
  • 第一个参数指定一个字符串,它包含了0个或者多个由delim字符串中一个或者多个分隔符分割的标记。
  • strtok函数找到str中的下一个标记,并将其用\0 结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以被strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)
  • strtok函数的第一个参数不为NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
  • strtok函数的第一个参数为NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
  • 如果字符串中不存在更多的标记,则返回NULL 指针。

11.4 使用示例

以下代码使用 strtok 按空格分割字符串:

#include <stdio.h>
#include <string.h>
int main()
{
	char arr[] = "Kunming University of Science and Technology Faculty of Information Engineering and Automation";
	char* sep = " ";
	char* str = NULL;
	for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep))
	{
		printf("子字符串:%s\n", str);
	}
	return 0;
}

输出结果:

子字符串:Kunming
子字符串:University
子字符串:of
子字符串:Science
子字符串:and
子字符串:Technology
子字符串:Faculty
子字符串:of
子字符串:Information
子字符串:Engineering
子字符串:and
子字符串:Automation

11.5 实现原理

  • 首次调用
    • strtok 接收完整字符串 str 和分隔符 delim
    • 找到第一个分隔符位置,将其替换为 \0,以标记第一个子字符串的结束。
    • 返回指向第一个子字符串的指针。
  • 后续调用
    • 如果 str 参数为 NULLstrtok 会继续从上次的位置向后查找下一个子字符串。
    • 找到分隔符后继续分割,直到字符串末尾。

12. strerror函数的使用

12.1 函数功能

strerror 是 C 标准库中的一个错误处理函数,用于将错误码(通常是 errno)转换为人类可读的错误信息字符串。这在调试程序和输出错误信息时非常有用。


12.2 函数声明

#include <string.h>
char *strerror(int errnum);
  • 参数:
    • errnum:一个整数类型的错误代码(通常是全局变量 errno 的值)。
  • 返回值:
    • 一个指向描述错误信息的字符串的指针。
    • 如果 errnum 不对应任何已定义的错误代码,则返回的字符串是实现相关的。

12.3 使用示例

我们首先来认识一下错误代码对应的字符串

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

int main(int argc, char const *argv[])
{
	for (int i = 0; i < 42; i++)
	{
		printf("%d: %s\n", i, strerror(i));
	}
	
	return 0;
}

输出:

0: No error
1: Operation not permitted
2: No such file or directory
3: No such process
4: Interrupted function call
5: Input/output error
6: No such device or address
7: Arg list too long
8: Exec format error
9: Bad file descriptor
10: No child processes
11: Resource temporarily unavailable
12: Not enough space
13: Permission denied
14: Bad address
15: Unknown error
16: Resource device
17: File exists
18: Improper link
19: No such device
20: Not a directory
21: Is a directory
22: Invalid argument
23: Too many open files in system
24: Too many open files
25: Inappropriate I/O control operation
26: Unknown error
27: File too large
28: No space left on device
29: Invalid seek
30: Read-only file system
31: Too many links
32: Broken pipe
33: Domain error
34: Result too large
35: Unknown error
36: Resource deadlock avoided
37: Unknown error
38: Filename too long
39: No locks available
40: Function not implemented
41: Directory not empty

以下代码展示了 strerror 的基本用法:

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

int main() {
    FILE *file;

    // 尝试打开一个不存在的文件
    file = fopen("nonexistent.txt", "r");
    if (file == NULL) {
        // 打印errno的值和对应的错误信息
        printf("错误代码: %d\n", errno);
        printf("错误信息: %s\n", strerror(errno));
    }

    return 0;
}

输出结果(示例):

错误代码: 2
错误信息: No such file or directory

12.4 strerror 的常见用途

  1. 错误处理和调试
    • 在程序出错时,输出错误码对应的可读信息,便于排查问题。
    • 通常配合标准库的 errno 使用。
  2. 日志记录
    • 将错误信息写入日志文件,便于开发者在后续分析错误原因。
  3. 用户提示
    • 当程序出错时,向用户展示错误原因,而不仅仅是错误代码。

12.5 实现原理

错误代码 (errno):

errno 是一个全局变量,定义在 <errno.h> 中,用于存储最近一次函数调用的错误代码。标准库函数在出错时会设置 errno,以便开发者通过 strerror 查询错误信息。

strerror 的工作机制:

  • strerror 通过 errnum 查找内部的错误信息表,并返回对应的描述信息。
  • 如果 errnum 超出范围,则返回实现相关的默认错误信息。

12.6 扩展

可以了解一下 perror 函数,perror函数相当于一次将上述代码中的第9行完成了,直接将错误信息打印出来。perror函数打印完参数部分的字符串后,再打印一个冒号和一个空格,再打印错误信息。

#include <stdio.h>
#include <string.h>
#include <errno.h>
int main ()
{
	FILE * pFile;
	pFile = fopen ("unexist.ent","r");
	if (pFile == NULL)
		perror("Error opening file unexist.ent");
	return 0;
}

输出:

Error opening file unexist.ent: No such file or directory

—完—

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

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

相关文章

IDEA怎么定位java类所用maven依赖版本及引用位置

在实际开发中&#xff0c;我们可能会遇到需要搞清楚代码所用依赖版本号及引用位置的场景&#xff0c;便于排查问题&#xff0c;怎么通过IDEA实现呢&#xff1f; 可以在IDEA中打开项目&#xff0c;右键点击maven的pom.xml文件&#xff0c;或者在maven窗口下选中项目&#xff0c;…

使用vscode+expo+Android夜神模拟器运行react-native项目

1.进入夜神模拟器安装路径下的bin目录 2.输入命令&#xff0c;连接Android Studio 启动夜神模拟器后&#xff0c; 打开安装目录的bin文件夹执行下面的命令&#xff0c;只需执行一次&#xff09; nox_adb.exe connect 127.0.0.1:62001adb connect 127.0.0.1:62001 3.运行项目…

IPv6 NDP 记录

NDP&#xff08;Neighbor Discovery Protocol&#xff0c;邻居发现协议&#xff09; 是 IPv6 的一个关键协议&#xff0c;它组合了 IPv4 中的 ARP、ICMP 路由器发现和 ICMP 重定向等协议&#xff0c;并对它们作出了改进。该协议使用 ICMPv6 协议实现&#xff0c;作为 IPv6 的基…

个人全栈开发微信小程序上线了(记日记)

个人开发的全栈项目&#xff0c;《每日记鸭》微信小程序上线了&#xff01; 主要是技术栈&#xff1a;uniapp,koa2,mongodb,langchian&#xff1b; 感兴趣的小伙伴可以来捧捧场&#xff01;

用源码编译虚幻引擎,并打包到安卓平台

用源码编译虚幻引擎&#xff0c;并打包到安卓平台 前往我的博客,获取更优的阅读体验 作业内容: 源码编译UE5.4构建C项目&#xff0c;简单设置打包到安卓平台 编译虚幻 5 前置内容 这里需要将 Epic 账号和 Github 账号绑定&#xff0c;然后加入 Epic 邀请的组织&#xff0c…

如何更改手机GPS定位

你是否曾想过更改手机GPS位置以保护隐私、玩游戏或访问受地理限制的内容&#xff1f;接下来我将向你展示如何使用 MagFone Location Changer 更改手机GPS 位置&#xff01;无论是在玩Pokmon GO游戏、发布社媒贴子&#xff0c;这种方法都快速、简单且有效。 第一步&#xff1a;下…

如何在 Ubuntu 上使用 Docker 部署 LibreOffice Online

简介 LibreOffice Online&#xff08;也称为Collabora Online&#xff09;是一个开源的在线办公套件&#xff0c;它提供了与LibreOffice桌面版相似的功能&#xff0c;但完全在云端运行。这意味着用户可以通过浏览器访问和编辑文档&#xff0c;而无需在本地计算机上安装任何软件…

Uniapp运行环境判断和解决跨端兼容性详解

Uniapp运行环境判断和解决跨端兼容性 开发环境和生产环境 uniapp可通过process.env.NODE_ENV判断当前环境是开发环境还是生产环境&#xff0c;一般用于链接测试服务器或者生产服务器的动态切换。在HX中&#xff0c;点击运行编译出来的代码是开发环境&#xff0c;点击发行编译…

华为Ensp模拟器配置OSPF路由协议

目录 简介 实验步骤 Pc配置 路由器配置 OSPF配置 交换机配置 简介 开放式最短路径优先 (OSPF) 协议深度解析 简介 开放式最短路径优先&#xff08;Open Shortest Path First, OSPF&#xff09;是一种内部网关协议&#xff08;IGP&#xff09;&#xff0c;用于在自治系统…

【JavaEE初阶 — 多线程】线程池

目录 1. 线程池的原理 1.1 为什么要有线程池 1.2 线程池的构造方法 1.3 线程池的核心参数 1.4 TimeUnit 1.5 工作队列的类型 1.6 工厂设计模式 1.6.1 工厂模式概念 1.6.2 使用工厂模式的好处 1.6.3 使用工厂模式的典型案例 1.6.4 Thread…

Vue通过file控件上传文件到Node服务器

功能&#xff1a; 1.多文件同时上传、2.拖动上传、3.实时上传进度条、4.中断上传和删除文件、5.原生file控件的美化 搁置的功能: 上传文件夹、大文件切片上传、以及其他限制条件未处理 Node服务器的前置准备: 新建文件夹: file_upload_serve初始化npm: npm …

Spring Security使用基本认证(Basic Auth)保护REST API

基本认证概述 基本认证&#xff08;Basic Auth&#xff09;是保护REST API最简单的方式之一。它通过在HTTP请求头中携带Base64编码过的用户名和密码来进行身份验证。由于基本认证不使用cookie&#xff0c;因此没有会话或用户登出的概念&#xff0c;这意味着每次请求都必须包含…

[大数据] Iceberg

G:\Bigdata\25.iceberg 第3章 与 Hive集成 3.1 环境准备 1)Hive与Iceberg的版本对应关系如下 Hive 版本 官方推荐Hive版本 Iceberg 版本 2.x 2.3.8 0.8.0-incubating – 1.1.0 3.x 3.1.2 0.10.0 – 1.1.0 Iceberg与Hive 2和Hive 3.1.2/3的集成,支持以下特性: 创建表删除表…

JMeter监听器与压测监控之Grafana

Grafana 是一个开源的度量分析和可视化套件&#xff0c;通常用于监控和观察系统和应用的性能。本文将指导你如何在 Kali Linux 上使用 Docker 来部署 Grafana 性能监控平台。 前提条件 Kali Linux&#xff1a;确保你已经安装了 Kali Linux。Docker&#xff1a;确保你的系统已…

C/C++ 优化,strlen 示例

目录 C/C optimization, the strlen examplehttps://hallowed-blinker-3ca.notion.site/C-C-optimization-the-strlen-example-108719425da080338d94c79add2bb372 揭开优化的神秘面纱... 让我们来谈谈 CPU 等等&#xff0c;SIMD 是什么&#xff1f; 为什么 strlen 是一个很…

【Linux学习】【Ubuntu入门】1-8 ubuntu下压缩与解压缩

1.Linux系统下常用的压缩格式 常用的压缩扩展名&#xff1a;.tar、.tar.bz2、.tar.gz 2.Windows下7ZIP软件安装 Linux系统下很多文件是.bz2&#xff0c;.gz结尾的压缩文件。 3.Linux系统下gzip压缩工具 gzip工具负责压缩和解压缩.gz格式的压缩包。 gzip对单个文件进行…

【Linux网络编程】简单的UDP套接字

目录 一&#xff0c;socket编程的相关说明 1-1&#xff0c;sockaddr结构体 1-2&#xff0c;Socket API 二&#xff0c;基于Udp协议的简单通信 三&#xff0c;UDP套接字的应用 3-1&#xff0c;实现英译汉字典 一&#xff0c;socket编程的相关说明 Socket编程是一种网络通信…

【工控】线扫相机小结 第三篇

海康软件更新 目前使用的是 MVS_STD_4.3.2_240705.exe &#xff0c;最新的已经到4.4了。 一个大的变动 在上一篇中我们提到一个问题&#xff1a; 需要注意的是&#xff0c;我们必须先设置 TriggerSelector 是 “FrameBurstStart” 还是 “LineStart” 再设置TriggerMode 是 …

Java基础知识(五)

文章目录 ObjectObject 类的常见方法有哪些&#xff1f; 和 equals() 的区别hashCode() 有什么用&#xff1f;为什么要有 hashCode&#xff1f;为什么重写 equals() 时必须重写 hashCode() 方法&#xff1f; 参考链接 Object Object 类的常见方法有哪些&#xff1f; Object 类…

[高阶数据结构(一)]并查集详解

1.前言 本系列会带大家走进高阶数据结构的学习, 其中包括并查集,图论, LRU cache, B树, B树, B*树, 跳表. 其中, 图论中讲解的时间最长, 包括邻接表, 邻接矩阵, 广度优先遍历, 深度优先遍历, 最小生成树中的kruskal算法以及prim算法&#xff1b;最短路径中的dijkstra算法, bell…