【C/C++】字符函数和字符串函数

article/2025/6/25 8:15:08

在这里插入图片描述

文章目录

  • 前言
  • 字符函数和字符串函数
    • 1.字符分类函数
    • 2.字符转换函数
    • 3.strlen的使用和模拟实现
      • 3.1 代码演示
      • 3.2 strlen返回值
      • 3.3 strlen的模拟实现
    • 4.strcpy的使用和模拟实现
      • 4.1 代码演示
      • 4.2 模拟实现
    • 5.strcat的使用和模拟实现
      • 5.1 代码演示
      • 5.2 模拟实现
    • 6.strcmp的使用和模拟实现
      • 6.1 代码演示:
      • 6.2 模拟实现:
    • 7.strncpy函数的使用
      • 7.1 代码演示
      • 7.2 ⽐较strcpy和strncpy函数
    • 8.strncat函数的使用
      • 8.1 代码演示
      • 8.2 strcat和strncat对比
    • 9.strncmp函数的使用
      • 9.1 代码演示
      • 9.2 strcmp和strncmp⽐较
    • 10.strstr的使用和模拟实现
      • 10.1 代码演示
      • 10.2 strstr的模拟实现
    • 11.strtok函数的使用
      • 11.1 代码演示
      • 11.2 注意事项
    • 12.strerror函数的使用
      • 12.1 代码演示
      • 12.2 perror

前言

在编程的过程中,我们经常要处理字符和字符串,为了⽅便操作字符和字符串,C语⾔标准库中提供了 ⼀系列库函数,接下来我们就学习⼀下这些函数。

字符函数和字符串函数

1.字符分类函数

C语⾔中有⼀系列的函数是专⻔做字符分类的,也就是⼀个字符是属于什么类型的字符的。 这些函数的使⽤都需要包含⼀个头⽂件是 ctype.h

在这里插入图片描述

这些函数的使⽤⽅法⾮常类似,我们就讲解⼀个函数的事情,其他的⾮常类似:

int islower ( int c );

islower 是能够判断参数部分的 c 是否是⼩写字⺟的。 通过返回值来说明是否是⼩写字⺟,如果是⼩写字⺟就返回⾮0的整数,如果不是⼩写字⺟,则返回 0。

练习:

写⼀个代码,将字符串中的⼩写字⺟转⼤写,其他字符不变。

#include <stdio.h>
#include <ctype.h>
int main ()
{int i = 0;char str[] = "Test String.\n";char c;while (str[i]){c = str[i];if (islower(c)) c -= 32;putchar(c);i++;}return 0;
}

也可以写成

while(str[i]!='\0')
{if(islower(str[i])){str[i]=toupper(str[i]);}i++;
}

2.字符转换函数

C语⾔提供了2个字符转换函数:

int tolower ( int c ); //将参数传进去的⼤写字⺟转⼩写  
int toupper ( int c ); //将参数传进去的⼩写字⺟转⼤写 

上⾯的代码,我们将⼩写转⼤写,是-32完成的效果,有了转换函数,就可以直接使⽤ tolower 函 数。

#include <stdio.h>
#include <ctype.h>
int main ()
{int i = 0;char str[] = "Test String.\n";char c;while (str[i]){c = str[i];if (islower(c)) c = toupper(c);putchar(c);i++;}return 0;
}

3.strlen的使用和模拟实现

size_t strlen ( const char * str );//size_t是无符号整型

功能:统计参数 str 指向的字符串的⻓度。统计的是字符串中 ‘\0’ 之前的字符的个数。

参数:

• str :指针,指向了要统计⻓度的字符串。 返回值:返回了 str 指向的字符串的⻓度,返回的⻓度不会是负数,所以返回类型是 size_t 。

if((strlen("abc")-strlen("abcdef"))>0)//size_t为无符号整型,所以3-6一定大于0
{printf(">\n");//所以输出>
}
else
{printf("<=\n");
}

解决方案

(int)strlen("abc")-(int)strlen("abcdef")

3.1 代码演示

#include <stdio.h>
#include <string.h>
int main()
{const char* str = "abcdef";printf("%zd\n", strlen(str));return 0;
}

使⽤注意事项:

• 字符串以 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前⾯出现的字符个数(不包 含 ‘\0’ )。

• 参数指向的字符串必须要以 ‘\0’ 结束。

• 注意函数的返回值为 size_t ,是⽆符号的( 易错 )

• strlen的使⽤需要包含头⽂件

3.2 strlen返回值

#include <stdio.h>
#include <string.h>
int main()
{const char* str1 = "abcdef";const char* str2 = "bbb";if(strlen(str2) - strlen(str1) > 0)//size_t类型恒大于0{printf("str2 > str1\n");} else{printf("srt1 > str2\n");}return 0;
}

3.3 strlen的模拟实现

⽅式1:

//计数器⽅式 
int my_strlen(const char * str)
{int count = 0;assert(str);//assert断言 头文件<assert.h>while(*str){count++;str++;}return count;
}

⽅式2:

//不能创建临时变量计数器 
int my_strlen(const char * str)
{assert(str);if(*str == '\0')return 0;elsereturn 1 + my_strlen(str+1);//str+1是下一个字符的地址
}
比如
my_strlen("abcdef")=1+my_strlen("bcdef")

⽅式3:

//指针-指针的⽅式 
int my_strlen(char *s)
{assert(str);char *p = s;while(*p != '\0')p++;return p - s;
}

4.strcpy的使用和模拟实现

string copy

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

功能:字符串拷⻉,拷⻉到源头字符串中的 \0 为⽌

参数:

destination :指针,指向⽬的地空间

source :指针,指向源头数据

返回值:

strcpy 函数返回的⽬标空间的起始地址

4.1 代码演示

#include <stdio.h>
#include <string.h>
int main()
{char arr1[10] = {0};char arr2[] = "hello";strcpy(arr1, arr2);//\0也会拷贝进去printf("%s\n", arr1);return 0;
}

使⽤注意事项:

•源字符串必须以 ‘\0’ 结束.。

• 会将源字符串中的 ‘\0’ 拷⻉到⽬标空间。

• ⽬标空间必须⾜够⼤,以确保能存放源字符串。

• ⽬标空间必须可修改。(不能是常量字符串,因为常量字符串不可以修改)

4.2 模拟实现

#include <stdio.h>
#include <assert.h>
//1.参数顺序 
//2.函数的功能,停⽌条件 
//3.assert
//4.const修饰指针 
//5.函数返回值 
char* my_strcpy(char *dest, const char*src)//src不能修改
{ char *ret = dest;//dest++后变了 所以先存起来assert(dest != NULL);assert(src != NULL);while((*dest++ = *src++))//先用再++,当*src为\0时,终止循环{;}return ret;
}
int main()
{char arr1[10] = {0};char arr2[] = "hello";my_strcpy(arr1, arr2);printf("%s\n", arr1);return 0;
}
void my_strcpy(char* dest,char* src)
{
//拷贝\0前面的内容
while(*src!='\0'){*dest=*src;dest++;src++;}*dest=*src;//拷贝\0
}

5.strcat的使用和模拟实现

连接字符串

char * strcat ( char * destination, const char * source );

功能:字符串追加,把 source 指向的源字符串中的所有字符都追加到 destination 指向的空间 中。

参数:

destination :指针,指向⽬的地空间

source :指针,指向源头数据

返回值:

strcat 函数返回的⽬标空间的起始地址

5.1 代码演示

#include <stdio.h>
#include <string.h>
int main()
{char arr1[20] = "hello ";char arr2[] = "world";strcat(arr1, arr2);printf("%s\n", arr1);return 0;//输出hello world
}

使用注意事项:

• 源字符串必须以 ‘\0’ 结束。

• ⽬标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。

• ⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。

• ⽬标空间必须可修改。

5.2 模拟实现

#include <stdio.h>
#include <assert.h>
char* my_strcat(char *dest, const char*src)
{char *ret = dest;assert(dest != NULL);assert(src != NULL);//这两行等价于assert(dest&&src)//1.找到目标空间中的\0while(*dest)//while(*dest!='\0'){dest++;}while((*dest++ = *src++)){;}return ret;
}
int main()
{char arr1[20] = "hello ";char arr2[] = "world";my_strcat(arr1, arr2);printf("%s\n", arr1);return 0;
}

那如果是自拼接呢

my_strcat(arr1,arr1)
//自拼接会:1.死循环2.系统崩溃            

在这里插入图片描述

6.strcmp的使用和模拟实现

两个字符串比较应用场景 登录: 输入 :用户名 密码

​ 数据库 用户名 密码

int strcmp ( const char * str1, const char * str2 );

功能:⽤来⽐较 str1 和 str2 指向的字符串,从两个字符串的第⼀个字符开始⽐较,如果两个字符 的ASCII码值相等,就⽐较下⼀个字符。直到遇到不相等的两个字符,或者字符串结束。

参数:

str1 :指针,指向要⽐较的第⼀个字符串

str2 :指针,指向要⽐较的第⼆个字符串

返回值:

• 标准规定:

◦ 第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字

◦ 第⼀个字符串等于第⼆个字符串,则返回0

◦ 第⼀个字符串⼩于第⼆个字符串,则返回⼩于0的数字

6.1 代码演示:

#include <stdio.h>
#include <string.h>
int main()
{char arr1[] = "abcdef";char arr2[] = "abq";int ret = strcmp(arr1, arr2);printf("%d\n", ret);if(ret > 0)printf("arr1 > arr2\n");else if(ret == 0)printf("arr1 == arr2\n");elseprintf("arr1 < arr2\n");return 0;
}

6.2 模拟实现:

int my_strcmp (const char * str1, const char * str2)
{int ret = 0 ;assert(str1 != NULL);assert(str2 != NULL);while(*str1 == *str2){if(*str1 == '\0')return 0;str1++;str2++;}return *str1-*str2;//最后比较的ASII码值的差
}

7.strncpy函数的使用

strcpy strcat strcmp 是长度不受限的字符串比较 不安全
strncpy strncat strncmp 长度受限函数

char * strncpy ( char * destination, const char * source, size_t num );

功能:字符串拷⻉;将 source 指向的字符串拷⻉到 destination 指向的空间中,最多拷⻉ num 个字符。

参数

destination :指针,指向⽬的地空间

source :指针,指向源头数据

num :从source指向的字符串中最多拷⻉的字符个数

返回值:

strncpy 函数返回的⽬标空间的起始地址

7.1 代码演示

#include <stdio.h>
#include <string.h>
int main()
{char arr1[20] = {0};char arr2[] = "abcdefghi";char* str = strncpy(arr1, arr2, 5);printf("%s\n", arr1);printf("%s\n", str);return 0;
}

长度足够,让拷贝几个就几个,长度小于num补\0

7.2 ⽐较strcpy和strncpy函数

strcpy 函数拷⻉到 \0 为⽌,如果⽬标空间不够的话,容易出现越界⾏为。

strncpy 函数指定了拷⻉的⻓度,源字符串不⼀定要有 \0 ,同时在设计参数的时候,就会多⼀层 思考:⽬标空间的⼤⼩是否够⽤, strncpy 相对 strcpy 函数更加安全。

8.strncat函数的使用

char * strncat ( char * destination, const char * source, size_t num );

功能:字符串追加;将 source 指向的字符串的内容,追加到 destination 指向的空间,最多追 加 num 个字符。

参数

destination :指针,指向了⽬标空间

source :指针,指向了源头数据

num :最多追加的字符的个数

返回值:返回的是⽬标空间的起始地址

8.1 代码演示

#include <stdio.h>
#include <string.h>
int main()
{char arr1[20] = "hello ";char arr2[] = "world";char* str = strncat(arr1, arr2, 5);//从\0开始追加,追加万还加\0printf("%s\n", arr1);printf("%s\n", str);//若num>长度,则追加\0return 0;
}

8.2 strcat和strncat对比

• 参数不同, strncat 多了⼀个参数

• strcat 函数在追加的时候要将源字符串的所有内容,包含 \0 都追加过去,但是 strncat 函 数指定了追加的⻓度。

strncat 函数中源字符串中不⼀定要有 \0 了。

• strncat 更加灵活,也更加安全。

9.strncmp函数的使用

int strncmp ( const char * str1, const char * str2, size_t num );

功能:字符串⽐较;⽐较 str1 和 str2 指向的两个字符串的内容,最多⽐较 num 字符。

参数:

str1 :指针,指向⼀个⽐较的字符串

str2 :指针,指向另外⼀个⽐较的字符串

num :最多⽐较的字符个数

返回值:

• 标准规定:

◦ 第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字

◦ 第⼀个字符串等于第⼆个字符串,则返回0

◦ 第⼀个字符串⼩于第⼆个字符串,则返回⼩于0的数字

在这里插入图片描述

9.1 代码演示

#include <stdio.h>
#include <string.h>
int main()
{char arr1[] = "abcdef";char arr2[] = "abcqw";int ret1 = strncmp(arr1, arr2, 3);printf("%d\n", ret1);int ret2 = strncmp(arr1, arr2, 4);printf("%d\n", ret2);return 0;
}

9.2 strcmp和strncmp⽐较

• 参数不同

• strncmp可以⽐较任意⻓度了

• strncmp函数更加灵活,更加安全

10.strstr的使用和模拟实现

char * strstr ( const char * str1, const char * str2);

功能:strstr 函数,查找 str2 指向的字符串在 str1 指向的字符串中第⼀次出现的位置。 简⽽⾔之:在⼀个字符串中查找⼦字符串。 strstr 的使⽤得包含<string.h>

参数:

str1 :指针,指向了被查找的字符串

str2 :指针,指向了要查找的字符串
返回值:

• 如果str1指向的字符串中存在str2指向的字符串,那么返回第⼀次出现位置的指针

• 如果str1指向的字符串中不存在str2指向的字符串,那么返回NULL(空指针)

10.1 代码演示

/* strstr example */
#include <stdio.h>
#include <string.h>
int main ()
{char str[] ="This is a simple string";char * pch;pch = strstr (str,"simple");if (pch != NULL)printf("%s\n", pch);elseprintf("查找的字符串不存在\n");return 0;
}
int main()
{char arr1[]="this is an apple\n";const char* p="is";//放的是i的地址char* ret = strstr(arr1,p);printf("%s\n",ret);return 0;
}

10.2 strstr的模拟实现

char * strstr (const char * str1, const char * str2)//str1 str2不希望被修改
{char *cp = (char *) str1;char *s1, *s2;//特殊情况:str2是空字符串时,直接返回str1 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); //找不到则返回NULL 
}

先来一种简单情况 在abcdef 中找 bcd

在这里插入图片描述

str1指向a时,不符合,所以++指向b,此时与*str2相等,然后str2++,再str1++,直到str2指向\0时结束

再来一种复杂情况

在这里插入图片描述

从第一个b开始时没有
可能存在多次匹配
还得有两个指针变量 存放他们两个的起始变量 然后对他们++ 让起始位置向后平移
char* my_strstr(const char* str1,const char* str2)
{const char* s1=NULL;const char* s2=NULL;const char* cur=str1;while(*cur){s1=cur;s2=str2;while(*s1!='\0'&&*s2!='\0'&&*s1==*s2){s1++;s2++;}if(*s2=='\0'){return char* cur;}cur++;}return NULL;
}

strstr函数的实现有多种,可以暴⼒查找,也有⼀种⾼效⼀些的算法:KMP,有兴趣的可以去学习。

11.strtok函数的使用

char *strtok(char *str, const char *delim);
//delim参数指向了一个字符串,定义了用作分隔符的字符的集合

功能

• 分割字符串:根据delim 参数中指定的分隔符,将输⼊字符串str 拆分成多个⼦字符串。

• 修改原始字符串: strtok 会直接在原始字符串中插⼊’\0’ 终⽌符,替换分隔符的位置,因 此原始字符串会被修改。

参数

1.str :⾸次调⽤时传⼊待分割的字符串;后续调⽤传⼊NULL ,表⽰继续分割同⼀个字符串。

2.delim :包含所有可能分隔符的字符串(每个字符均视为独⽴的分隔符)。

返回值

• 成功时返回指向当前⼦字符串的指针。

• 没有更多⼦字符串时返回NULL 。

使⽤步骤

  1. ⾸次调⽤:传⼊待分割字符串和分隔符。
  2. 后续调⽤:传⼊NULL 和相同的分隔符,继续分割。
  3. 结束条件:当返回NULL 时,表⽰分割完成。

11.1 代码演示

int main()
{char arr[]="fnianxu@yeah.net";char arr2[30]={0};//"fnianxu\0yeah\0net"strcpy(arr2,arr);const char* sep="@.";//传入NULL在\0之后继续进行char* ret=NULL;//初始化ret = strtok(arr2,sep);printf("%s\n",ret);ret = strtok(NULL,sep);printf("%s\n",ret);ret = strtok(NULL,sep);printf("%s\n",ret);
}

运行结果如下:

在这里插入图片描述

但一直传入空指针有些麻烦,所以看以下示例

#include <stdio.h>
#include <string.h>
int main()
{char arr[] = "192.168.6.111";const char* sep = ".";const char* str = NULL;char buf[30] = {0};strcpy(buf, arr); //将arr中的字符串拷⻉到buf中,对buf的内容进⾏切割 for (str = strtok(buf, sep); str != NULL; str = strtok(NULL, sep)){printf("%s\n", str);}return 0;
}

11.2 注意事项

• 破坏性操作: strtok 会直接修改原始字符串,将其中的分隔符替换为’\0’ 。如果需要保留原字符串,应先拷⻉⼀份。

• 连续分隔符:多个连续的分隔符会被视为单个分隔符,不会返回空字符串。

• 空指针处理:如果输⼊的str 为NULL 且没有前序调⽤,⾏为未定义。

12.strerror函数的使用

char* strerror ( int errnum );

功能

1.strerror 函数可以通过参数部分的errnum 表示错误码,得到对应的错误信息,并且返回这个错误信息字符串⾸字符的地址

2.strerror 函数只针对标准库中的函数发⽣错误后设置的错误码的转换。

3.strerror 的使⽤需要包含<string.h>

在不同的系统和C语⾔标准库的实现中都规定了⼀些错误码,⼀般是放在 errno.h 这个头⽂件中说 明的,C语⾔程序启动的时候就会使⽤⼀个全局的变量 errno 来记录程序的当前错误码,只不过程序启动的时候errno 是0,表⽰没有错误,当我们在使⽤标准库中的函数的时候发⽣了某种错误, 就会将对应的错误码,存放在 errno 中,⽽⼀个错误码的数字是整数,很难理解是什么意思,所 以每⼀个错误码都是有对应的错误信息的。strerror函数就可以将错误码对应的错误信息字符串的地 址返回。

参数:

errnum :表示错误码

这个错误码⼀般传递的是 errno 这个变量的值,在C语⾔有⼀个全局的变量叫: errno ,当库函数 的调⽤发⽣错误的时候,就会讲本次错误的错误码存放在 errno 这个变量中,使⽤这个全局变量需要 包含⼀个头⽂件 errno.h 。

返回值:

函数返回通过错误码得到的错误信息字符串的⾸字符的地址。

12.1 代码演示

#include <errno.h>
#include <string.h>
#include <stdio.h>
//我们打印⼀下0~10这些错误码对应的信息 
int main()
{int i = 0;for (i = 0; i <= 10; i++) {printf("%d: %s\n", i, strerror(i));}return 0;
}

在Windows11+VS2022环境下输出的结果如下:

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

举例:

#include <stdio.h>
#include <string.h>
#include <errno.h>
int main ()
{FILE * pFile = NULL;//fopen函数以读的形式打开⽂件,如果⽂件不存在,则打开失败。 pFile = fopen ("unexist.ent", "r");if (pFile == NULL){printf ("错误信息是:%s\n", strerror(errno));return 1;//错误返回 }//读文件 fclose(pf);//关闭文件return 0;//空指针不能解引用
}

输出:

错误信息是:No such file or directory

12.2 perror

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

perror有能力直接打印错误信息,打印的时候,先打印传给perror的字符串,然后打印冒号,再打印空格,最后打印错误码对应信息

perrpr=printf+strerror

#include <stdio.h>
#include <string.h>
#include <errno.h>
int main ()
{FILE * pFile = NULL;pFile = fopen ("unexist.ent", "r");if (pFile == NULL){perror("错误信息是");return 1;}return 0;
}

输出:

错误信息是: No such file or directory

http://www.hkcw.cn/article/cPwRUjbQOY.shtml

相关文章

C/C++之内存管理

1. 内存分布 我们定义的变量对于电脑来说也叫数据&#xff0c;同时电脑也会把这些数据分为不同的类型&#xff0c;分别是局部数据&#xff0c;静态数据&#xff0c;全局数据&#xff0c;常量数据和动态申请数据。 在 C 中&#xff0c;各类数据存储位置如下&#xff1a; • 局…

C++从入门到实战(十一)详细讲解C/C++语言中内存分布与C与C++内存管理对比

C从入门到实战&#xff08;十一&#xff09;详细讲解C/C语言中内存分布与C与C内存管理对比 前言一、C/C语言中内存分布1.内核空间2.栈3.堆4.数据段5.代码段 二、例题带练巩固C/C语言中内存分布的知识题目讲解题目答案 三、C语言动态内存分配&#xff08;知识回顾&#xff09;3.…

Educational Codeforces Round 175 (C.二分 D.树形结构、dp)

文章目录 2025.3.3C. Limited Repainting(二分)题意思路代码 D. Tree Jumps(树形结构、dp)题意思路代码 2025.3.3 Educational Codeforces Round 175 (Rated for Div. 2) C. Limited Repainting(二分) 题意 给出一个字符串a由“R”B“组成&#xff0c;不同位置对应一个惩罚…

老太突然倒地吓坏路人民警紧急相救 家属感激救命之恩

“谢谢你们帮我父亲‘捡’回一条命,再晚一会儿后果不堪设想!”5月21日,市民刘女士接到民警电话时再次表达了对紧急救援的感激之情。她的父亲76岁,患有阿尔兹海默病,下午扛着锄头出门后一直未归,家人找了3个多小时都没找到。5月19日傍晚6时许,大冶市公安局还地桥派出所接…

53岁男子诱骗侵害幼女被判刑 深挖彻查揭露更多罪行

5月29日,江苏省人民检察院召开新闻发布会,介绍了近年来加强未成年人网络司法保护的工作情况及典型案例。如皋市检察院副检察长卢海琴介绍了一起典型案例,通过深挖彻查,案件从1名被告人追到3名被告人、从1个罪名查到5个罪名、从1起强奸事实挖到19起犯罪事实、从1名被害人增加…

谷歌DeepMind最强手语翻译模型登场 打破沟通障碍

谷歌DeepMind团队于5月27日宣布推出SignGemma,这是其迄今为止最强大的手语翻译模型,能够将手语转化为口语文本。该开源模型计划在今年晚些时候加入Gemma模型家族。SignGemma支持多语言功能,但目前主要针对美国手语(ASL)和英语进行了深度优化,开发者可以自由使用并改进它。…

【C++】STL详解-----(二)vetor的使用

文章目录 vector的介绍vector的使用&#xff1a;元素访问empty vector的增删查改push_back和pop_backinsert和erase vector迭代器失效问题迭代器失效解决方法 vector的介绍 vector是可变大小数组的容器vector采用连续空间存储的方式&#xff0c;同时也表示可以采用下标访问vec…

string类

1. 为什么学习string类&#xff1f; string叫串&#xff0c;它是一个管理字符串的类&#xff0c;现实中为什么要出一个管理字符串的类呢&#xff1f;现实中我们有很多类型&#xff0c;比如int、double、char等&#xff0c;但发现这个世界的一些复杂东西都是通过字符串表示的…

潍坊烟花秀压轴项目缺席遭吐槽 设备故障引争议

多名网友在社交平台发帖表示,5月30日晚他们参加了潍坊世界风筝乐园的烟花秀表演,单人票198元,双人票298元。然而,之前宣传的压轴项目“七彩祥云”并未出现,引发观众不满。潍坊世界风筝乐园工作人员解释称,由于设备故障,“七彩祥云”环节被迫取消,并且当晚和接下来两天的…

江苏城市足球联赛为何这么火 赛事带动文旅热潮

最近,2025年江苏省城市足球联赛“苏超”火了。从“比赛第一,友谊第十四”到各地纷纷推出“跟着赛事游江苏”的文旅优惠,以足球为媒,以赛事为桥,江苏展现了独特的魅力。自5月10日揭幕以来,“苏超”迅速走红,成为江苏省乃至全国关注的热点。你以为“苏超”只是踢踢比赛?殊…

汪涵体验问界M9五座零重力座椅 舒适到不想起

汪涵体验了问界M9的零重力座椅,表情十分享受。这款座椅采用零压感知人体工学专利设计,腰部零压角为121,腿部零压角为136,能够使全身压力均匀分布,带来零压悬浮感。汪涵坐在上面久久不愿起身,甚至在车展主持时也选择躺着进行,这种舒适度让人非常心动。责任编辑:0882

德国为何要解除对援乌武器射程限制 西方军援策略重大转变

2025年5月28日,德国新当选总理弗里德里希默茨在柏林宣布,乌克兰的西方盟友将取消向基辅供应武器的射程限制。这一政策调整涵盖美国、英国、法国和德国等主要援乌国家,标志着西方对乌军援策略的重大转变,随即引发国际社会对俄乌冲突走向的强烈关注。在WDR组织的论坛上,默茨…

Nginx基础篇(Nginx目录结构分析、Nginx的启用方式和停止方式、Nginx配置文件nginx.conf文件的结构、Nginx基础配置实战)

文章目录 1. Nginx目录结构分析1.1 conf目录1.2 html目录1.3 logs目录1.4 sbin目录 2. Nginx的启用方式和停止方式2.1 信号控制2.1.1 信号2.1.2 调用命令 2.2 命令行控制2.2.1 基础操作类2.2.2 配置测试类2.2.3 进程控制类2.2.4 路径与文件类2.2.5 高级配置类 3. Nginx配置文件…

印军高层被追问是否与巴方会面 印空军将领打马虎眼

印巴停火协议签署后,两国都在宣称自己取得了胜利。然而,印度军方的表现却让人失望。5月11日,印度空军中将巴蒂召开记者会,面对记者们的追问,他声称印度空军在这次冲突中表现出色,并坚称打下了好几架巴基斯坦飞机。但当被问及具体数字时,他却表示“不想冒险猜测”,并解释…

大V:辽宁舰率海军最强编队驶入西太 展现惊人实力

自去年10月在南海与山东舰稍微展示了一下双航母的实力后,辽宁舰到今年5月中旬都没有什么动作,大家的目光都放在了更出色的山东舰和福建舰上。然而,辽宁舰在5月下旬南下西太平洋,展示了强大的实力。护航编队包括两艘055型驱逐舰、五艘052D型驱逐舰和三艘054A型护卫舰,再加上…

印度刚喊话巴基斯坦,转头联合蒙古军演?背后算盘藏不住了!

印度最近的一系列举动引起了广泛关注。不久前,印度还在与巴基斯坦紧张对峙,并放狠话威胁对方,紧接着又派了一个大型商业代表团访问台湾。更令人意外的是,印度现在绕过中国,直接与蒙古国进行联合军事演习。这种行为就像是小孩子打架,正面打不过就绕到背后捅手指头。然而,…

25艘龙船巡游广州荔湾湖 展现广府龙舟文化魅力

5月31日,第十五届“荔枝湾新西关”民俗文化活动“五月五龙船鼓”在广州荔湾湖公园盛大开幕。上午8时30分,十多艘来自南海盐步、坑口、茶滘等地的龙船装饰一新,从珠江口岸徐徐进入荔湾湖面,与泮塘村的龙船一同趁景。泮塘村的龙船作为东道主,率先引领着各兄弟村的龙船队伍绕…

河南鹤壁一水库水位下降现千佛石窟 千年佛像重见天日

近日,有网友发布视频显示,河南省鹤壁市淇县夺丰水库水位下降后,露出一处石洞。这处石洞虽然洞口不大,但内部却别有洞天,四周布满佛像,造型精细,栩栩如生。洞内还有较深的积水。不少网友称这个洞为千佛洞,并有人前来打卡。该石窟名为前嘴石窟,开凿于东魏时期,千百年来…

全世界都在划龙舟过端午 全球共庆文化盛宴

当农历五月的暖风拂过东亚的稻田,粽叶的清香飘荡在东南亚的街巷,龙舟的鼓点响彻欧美的河流,全世界共同庆祝源自中国的古老节日——端午节。这个绵延两千多年的传统节日,早已超越地域界限,成为人类共享的文化盛宴。在中国,从江南水乡到北国平原,家家户户清晨便飘起蒸煮粽…

美禁运C919发动机 破局之道在哪里 核心技术自主可控

没有发动机,中国的大飞机还能飞吗?当美国突然暂停向中国商飞出售航空发动机技术时,这个问题迅速引起广泛关注。西方媒体纷纷唱衰“C919即将搁浅”,而中国外交部则强硬回击,坚决反对这种恶意封锁。这场看似突如其来的问题,实际上揭示了中美科技竞争的深层次矛盾——中国航…