【无标题】

字符串

1.字符串的定义

#include <stdio.h>

int main()
{
	int data[] = {1,2,3,4,5};
	char cdata[] = {'h','e','l','l','o'};
	char cdata2[] = "hello";
	char *pchar = "hello";
	char c = 'c';
	
	cdata2[3] = 'm';
	printf("%s",cdata2);//可以进行修改
	putchar('\n');
	puts(cdata2);//进行输出打印
	*pchar = 'm';
	puts("end");//注意指针的操作 保存地址可以,修改指向,指向字符串常量的地址空间 对野指针的内存空间操作不行
	/*
	int i;
	for(i=0;i<5;i++){
		printf("%c",*(pchar+i));
	}*/
	return 0;
}

2.字符数组的存储方式

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

void test()
{
	
}
//strcpy strcmp strcat strstr
int main()
{
	char cdata[128] = "hello";//'\0'
	void (*ptest)();
	ptest = test;
	printf("sizeof :%d\n",sizeof(cdata));
	printf("strlen: %d\n",strlen(cdata));
	
	char *p = "hello";
	
	printf("sizeof:p      :%d\n",sizeof(p));//8
	printf("sizeof:char*  :%d\n",sizeof(char *));//	8
	printf("sizeof:int*  :%d\n",sizeof(int *));//	8
	printf("sizeof:char   :%d\n",sizeof(char));//	1
	printf("sizeof:ptest   :%d\n",sizeof(ptest));//	8
	printf("strlen        :%d\n",strlen(p));//5
	
	return 0;
}

注意:
1.只要是指针类型,都占8个字节,函数指针同样如此
2.strlen函数是针对字符串的实际长度而言的

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


int main()
{
	
	int data[] = {1,2,3,4,5};

	char cdata[6] = {'h','e','l','l','o'};
	char cdata2[] = "hello";
	
	int len = sizeof(data)/sizeof(data[0]);
	printf("len = %d\n",len);//5
	
	len = sizeof(cdata2)/sizeof(cdata2[0]);
	printf("len = %d\n",len);//6
	
	len = sizeof(cdata)/sizeof(cdata[0]);
	printf("len = %d\n",len);//6
	
	printf("%s\n",cdata);
	
	return 0;
}

字符串数组或者是字符串的格式,计算长度的时候会自动添加结束符

3. 动态开辟空间

3.1 malloc函数

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

int main()
{
	char *p;
	p = (char *)malloc(1);
	
	*p = 'c';//如果不开辟空间,野指针报错。野指针就是没有的内存指向
	free(p);//释放地址
	p = NULL; 
	p = (char *)malloc(12);
	if(p == NULL){         
		printf("malloc error\n");
		exit(-1);
	}

	memset(p,'\0',12);//用'\0'清空内存,输出分配的内存地址(十六进制)12个字节的空间大小
	printf("%x\n",p);//输出地址
	int len = strlen("chenlichen2342354364575467");
	int newLen = len - 12 + 1;
	p = realloc(p,newLen); //realloc可能改变内存地址,需重新记录指针
	printf("%x\n",p);
	strcpy(p,"chenlichen2342354364575467");//strcpy将24字符的字符串拷贝到仅13字节的内存 → 导致缓冲区溢出(严重错误)。
	puts(p);
	puts("end");
	return 0;
}

3.2 stsncpy 字符串复制

#include <stdio.h>
#include <string.h>
int main()
{
	char *p = "chenlichen handsome";//p指向字符串常量"chenlichen handsome"(存放在只读内存区域)。
	char str[128] = {'\0'};//str是一个长度为128的字符数组,初始化为空字符串。
	

	puts(p);
	printf("%s\n",p);
	strncpy(str,p,6);
	puts(str);
	return 0;
}

把src所指向的字符串(包括“\0”)复制到dest所指向的字符串后面(删除dest原来末尾的“\0”)。要保证dest足够长,以容纳被复制进来的*src。*src中原有的字符不变。返回指向dest的指针。

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

char* myStrcat(char *des, char *src)
{
	assert( des!=NULL && src!=NULL);
	char *bak = des;
	
	while(*des){
		des++;
	}
	while((*des++ = *src++) != '\0');
	*des = '\0';
	
	return bak;
}
char* myStrcat2(char *des, char *src)
{
	char *bak = des;
	strcpy(des+strlen(des),src);
	return bak;
}

char* myStrcat3(char *des, char *src)
{
	assert( des!=NULL && src!=NULL);
	char *bak = des;
	
	for(;*des!='\0';des++);
	while((*des++ = *src++) != '\0');
	*des = '\0';
	
	return bak;
}
int main()
{
	char str[128] = "chenlichen";
	char *p2;
	char *p = " handsome";
	p2 = myStrcat(str,p);
	//p2 = strcat(str,p);
	puts(str);
	//puts(p2);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值