08:字符串

1、字符串的定义

# include <stdio.h>
/*
	字符串的使用
*/
int main(void)
{
	char a[] = {'H','e','l','l','o'};//定义字符串方式一
	char b[] = "Hello";//定义字符串方式二
	char* p = "Hello";//定义字符串方式三
	
	for(int i =0; i < sizeof(a)/sizeof(a[0]); i++)//方式的打印方式
	{
		printf("%c",a[i]);
	}
	puts("");
	for(int i =0; i < sizeof(b)/sizeof(b[0]); i++)//方式二的打印方式
	{
		printf("%c",b[i]);
	}
	puts("");
	for(int i =0; i < 5; i++)//方式二的打印方式
	{
		printf("%c",p[i]);//*(p+i)
	}
	puts("");
	
	printf("%s\n",a);
	printf("%s\n",b);
	printf("%s\n",p);//方式三的打印方式

	puts(a);
	puts(b);
	puts(p);//方式三的打印方式
	
	return 0;
}

如上面的代码,字符串有3种定义方式,但是前面的2中能改变字符串里面的字符,而第三种是定义的字符串常量,定义好了就不能够改变里面的字符了。
代码如下:

# include <stdio.h>
/*
	字符串的使用
*/
int main(void)
{
	char a[] = {'H','e','l','l','o'};//定义字符串方式一
	char b[] = "Hello";//定义字符串方式二
	char* p = "Hello";//定义字符串方式三
	
	a[0] = 'm';
	b[0] = 'm';
	*(p+0) = 'm';//error,这样会使程序崩溃
	
	printf("%c\n",a[0]);
	printf("%c\n",b[0]);
	//printf("%c\n",p[0]);
	
	return 0;
}

我们再来看看定义的字符串占用了几个字节喃?

# include <stdio.h>
# include <string.h>
/*
	字符串占用字节
*/
int main(void)
{
	int m[3] = {1,2,3};
	char n[] = {'n','i','h','a','o'};
	char a[] = {'H','e','l','l','o','\0'};
	char b[] = "Hello";
	char* p = "Hello";
	
	/*
		sizeof()函数:用于计算出变量占内存空间多少个字节。
	*/

	printf("%d\n",sizeof(a));//5给字节
	printf("%d\n",sizeof(b));//6个字节
	printf("%d\n",sizeof(p));//8个字节
	printf("%d\n",sizeof(p[0]));//1个字节
	printf("%d\n",sizeof(m));//12个字节
	
	puts("................");
	
	/*
		strlen()函数:用于计算字符串中有多个有效字符
		以'\0'标识符为结束符。
	*/
	printf("%d\n",strlen(n));//6
	printf("%d\n",strlen(a));//5
	printf("%d\n",strlen(b));//5
	printf("%d\n",strlen(p));//5
	return 0;
}
a变量占用了5个字节。因为里面有5个占用1个字节的元素
b变量占用6个字节,5个字节+'\0'。'\0'为字符串的结束字符
p占用8个字节,因为p为指针变量。
m占用12个字节
n没有'\0'结束符,所以为6
abp都有'\0'结束符,所以都是5

2、字符串常见的操作

①puts的使用:

#include <stdio.h>
#include <string.h>
 
int main()
{
	//第1种操作:puts(),此函数是对字符串打印,并且自动添加换行
	char* p = "woshinibaba";
	puts(p);
	printf("%s\n",p);
	return 0;
}

woshinibaba
woshinibaba

②scanf/gets的使用:

#include <stdio.h>
#include <stdlib.h>
int main()
{
	//第2种操作:scanf()/gets(),此函数是对字符串录入
	char* p  = (char*)malloc(5);//动态构造5个字节,给char类型的变量用
	puts("请输入字符串:");
	//scanf("%s",p);//输入字符串
	gets(p);//输入字符串
	puts(p);
	free(p);//释放空间
	return 0;
}

请输入字符串:
adadadw
adadadw

③字符串的拷贝:strcpy/strncpy

#include <stdio.h>
#include <string.h>
int main()
{
	//第2种操作:实现字符串的拷贝
	char a[128] = {'\0'};
	char b[128] = {'\0'};
	char* p = "wojintianhaoxiangni";
	strcpy(a,p);//将p的字符串拷贝到a
	strncpy(b,p,5);//将p的前5个字符拷贝到a
	puts(a);//打印输出a
	puts(b);//打印输出b
	return 0;
}

wojintianhaoxiangni
wojin

④字符串的拷贝函数的构造:

#include <stdio.h>

void Strcpy1(char* a,char* p);
void Strcpy2(char* a,char* p);
void Strcpy3(char* a,char* p);
void Strncpy(char* b,char* p,int count);

int main()
{
	//第2种操作:实现字符串的拷贝
	char a[128] = {'\0'};
	char b[128] = {'\0'};
	char* p = "wojintianhaoxiangni";
	Strcpy2(a,p);//将p的字符串拷贝到a
	Strncpy(b,p,5);//将p的前5个字符拷贝到a
	puts(a);//打印输出a
	puts(b);//打印输出b
	return 0;
}

void Strcpy1(char* a,char* p)//拷贝函数一
{
	//将p的字符串拷贝到a
	while(*p != '\0')
	{
		*a = *p;//将p的字符串拷贝到a
		p++;//地址的偏移
		a++;
	}
	*a = '\0';//给a的最后加上字符串结束符\0
}

void Strcpy2(char* a,char* p)//拷贝函数二
{
	//将p的字符串拷贝到a
	while(*p != '\0')
	{
		*a++ = *p++;//将p的字符串拷贝到a
	}
	*a = '\0';//给a的最后加上字符串结束符\0
}

void Strcpy3(char* a,char* p)//拷贝函数三
{
	//将p的字符串拷贝到a
	while((*a++ = *p++) != '\0');
	*a = '\0';//给a的最后加上字符串结束符\0
}

void Strncpy(char* b,char* p,int count)//拷贝函数四
{
	//将p的字符串拷贝到a
	while(*p != '\0' && count > 0)
	{
		*b++ = *p++;//将p的字符串拷贝到a
		count--;
	}
	*b = '\0';//给a的最后加上字符串结束符\0
}

wojintianhaoxiangni
wojin

⑤字符串的拼接strcat的使用和构造:

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

void Strcat1(char* a,char*p);

int main()
{
	//第2种操作:实现字符串的拷贝
	char a[128] = "wojintian";
	char* p = " haoxiangni";
	//strcat(a,p);//将p的字符串拼接到a,
	Strcat1(a,p);
	puts(a);//打印输出a
	return 0;
}

void Strcat1(char* a,char*p)
{
	while(*a != '\0')
	{
		a++;//地址偏移
	}
	while(*p != '\0')
	{
		*a = *p;
		  a++;
		  p++;
	}
	*a = '\0';
}

wojintian haoxiangni

⑥字符串的比较strcmp:
如果2给字符串相等则函数返回的是0,不相等返回的1/-1

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

int main()
{
	char* a = "woshinibaba";
	char* p = "woshinibaba";
	int ret = strcmp(a,p);
	if(strcmp(a,p) == 0)
	{
		puts("这2个字符串相等");
	}
	printf("%d\n",ret);
	return 0;
}

这2个字符串相等
0

  • 11
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
GeoPandas是一个开源的Python库,旨在简化地理空间数据的处理和分析。它结合了Pandas和Shapely的能力,为Python用户提供了一个强大而灵活的工具来处理地理空间数据。以下是关于GeoPandas的详细介绍: 一、GeoPandas的基本概念 1. 定义 GeoPandas是建立在Pandas和Shapely之上的一个Python库,用于处理和分析地理空间数据。 它扩展了Pandas的DataFrame和Series数据结构,允许在其中存储和操作地理空间几何图形。 2. 核心数据结构 GeoDataFrame:GeoPandas的核心数据结构,是Pandas DataFrame的扩展。它包含一个或多个列,其中至少一列是几何列(geometry column),用于存储地理空间几何图形(如点、线、多边形等)。 GeoSeries:GeoPandas中的另一个重要数据结构,类似于Pandas的Series,但用于存储几何图形序列。 二、GeoPandas的功能特性 1. 读取和写入多种地理空间数据格式 GeoPandas支持读取和写入多种常见的地理空间数据格式,包括Shapefile、GeoJSON、PostGIS、KML等。这使得用户可以轻松地从各种数据源中加载地理空间数据,并将处理后的数据保存为所需的格式。 2. 地理空间几何图形的创建、编辑和分析 GeoPandas允许用户创建、编辑和分析地理空间几何图形,包括点、线、多边形等。它提供了丰富的空间操作函数,如缓冲区分析、交集、并集、差集等,使得用户可以方便地进行地理空间数据分析。 3. 数据可视化 GeoPandas内置了数据可视化功能,可以绘制地理空间数据的地图。用户可以使用matplotlib等库来进一步定制地图的样式和布局。 4. 空间连接和空间索引 GeoPandas支持空间连接操作,可以将两个GeoDataFrame按照空间关系(如相交、包含等)进行连接。此外,它还支持空间索引,可以提高地理空间数据查询的效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值