C语言——字符串

字符串的定义

1.和整型一样——int data[]={1,2,3,4,5};
2.和整型数组一个道理——char str[]={‘h’,‘e’,‘l’,‘l’,‘o’};
3.改进——char str[]=“hello”;
4.一般用法char *p=“hello”;
5.3和4的区别:
3是字符串变量
4是字符串常量——不允许修改
注意指针的操作——1.保存地址可以——修改指向——指向字符串常量的地址空间
2.对野指针的内存空间操作不行

#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';
	
	
	char *p;//野指针,并没有明确的内存,危险;
	*p='a'
	
    cdata2[3]='m';	
	printf("%s",cdata2);
	putchar('\n');
	puts(cdata2);
	/*int i;
	for(i=0;i<5;i++){
		printf("%c",*(pchar+i));
	}*/
   return  0;
}

和整型数组在存储上的区别

多了结束标志’\0’

#include<stdio.h>

int main()
{  
    //字符串和字符数组的区别
	int data[]={1,2,3,4,5};
	//请计算数组data的元素个数
	char cdata[]={'h','e','l','l','o','\0'};//字符串的结束标志'\0'
	char cdata2[]="hello";
    
	int len=sizeof(data)/sizeof(data[0]);
	printf("len= %d\n",len);
	
	len=sizeof(cdata2)/sizeof(char);
	printf("len= %d\n",len);
	
    len=sizeof(cdata)/sizeof(char);
	printf("len= %d\n",len);
	
   return  0;
}

sizeof和strlen的区别

sizeof打印全部字符大小
strlen打印有效字符

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


void test()
{
	
}
//strcpy strcmp strcat strstr
int main()
{
	char cdata[128]="hello";//'\0'
	void (*ptest)();
	printf("sizeof:%d\n",sizeof(cdata));
	printf("strlen:%d\n",strlen(cdata));
	
	char *p="hello";
	
	printf("sizeof:p     :%d\n",sizeof(p));
	printf("sizeof:char* :%d\n",sizeof(char*));
	printf("sizeof:int*  :%d\n",sizeof(int*));
	printf("sizeof:char  :%d\n",sizeof(char));
	printf("sizeof:ptest :%d\n",sizeof(ptest));
	printf("strlen       :%d\n",strlen(p));
	return 0;
}
动态开辟字符串

malloc——函数原型:void malloc(size_tsize)——分配所需的内存空间,并返回一个指向它的指针。
realloc——函数原型void
realloc(voidptr,size_t size)——
尝试重新调整之前调用 malloc 或 calloc 所分配的 ptr 所指向的内存块的大小。
free—— 释放之前调用 calloc、malloc 或 realloc 所分配的内存空间;防止悬挂指针——野指针的一种
memset——函数原型——清理空间void
memset(voidstr,int c,size_t n)
void
st——初始化首内存的地址
int c——初始化变得数据
size_t n——长度即大小

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

//char *strcpy(char* dest,const char *src);
int main()
{
	char *p;
	p=(char*)malloc(1);//p有了具体的内存指向
	*p='c';
	free(p);
	p=NULL;
	p=(char*)malloc(12);
	if(p=NULL){
		printf("malloc error\n");
		exit(-1);
	}
	memset(p,'\0',12);
	printf("扩容地址:%x\n",p);
	int len=strlen("chenlichen22222333333");
	int newlen=len-12-1;
	realloc(p,newlen);
	printf("扩容后地址:%x\n",p);
	strcpy(p,"chenlichen22222333333");
	puts(p);
	puts("end");
	return 0;
}
字符串常用的API

1.输出字符串:puts(),printf(“%s”,p);
2获取字符串:scanf(“%s”,p),gets

#include<stdio.h>

int main()
{
	
	char *p="mnbvxvbnnmmmm  xxxccc";
	char str[128]={'\0'};
	//输出字符串
	puts(p);
	printf("%s\n",p);
	//获取字符串
	puts("请输入字符串");
	//scanf("%s",str);
	//gets(str);
	puts(str);
	return 0;
}

3.计算长度——strlen
4.拷贝:strcpy和strncpy
strncpy——拷贝固定字节

#include<stdio.h>
#include<assert.h>
char* myStrcpy(char *des,char*src)
{
	/*if(des==NULL||scr==NULL){
		return NULL;
	}*/
	assert(des!=NULL&&src!=NULL);//断言
	char *bak=des;
	while(*src!='\0'){
		*des=*src;
		des++;
		src++;
	}
	*des='\0';
	
	return bak;
}

char* myStrcpy2(char *des,char *scr)
{
	if(des==NULL||scr==NULL){
		return NULL;
	}
	char *bak=des;
	while(*scr!='\0'){
		*des++=*scr++;
	}
	*des='\0';
	
	return bak;
}

char* myStrcpy3(char *des,char *scr)
{
	if(des==NULL||scr==NULL){
		return NULL;
	}
	char *bak=des;
	while((*des++=*scr++)!='\0'){
	}
	*des='\0';
	
	return bak;
}


char* myStrncpy(char *des,char *src,int count)
{
	if(des==NULL||src==NULL){
		return NULL;
	}
	char *bak=des;
	while(*src!='\0' && count>0){
		*des++=*src++;
		count--;
	}
	if(count>0){
		while(count>0){
			count--;
			*des++='\0';
		}
		return des;
	}
	*des='\0';
	
	return bak;
}
int main()
{
	char str[128]={'\0'};
	//char *p="chenlichen handsome";
	char *p=NULL;
	char a='m';
	char b;
	if((b=a)=='m'){
		printf("ok\n");
	}
    myStrcpy(str,p);
	puts(str);
	return 0;
}

5.strcat——拼接
把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!='\0'){
		*des++;
	}
	while((*des++=*src++)!='\0');
		*des='\0';
	
	return bak;
}



int main()
{
	char str[128]="chenlichen";
	char *p="handsome";
	char *p2;
    p2=strcat(str,p);
    puts(str);
	puts(p2);
	return 0;
}

6.strcmp——若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数;
strncmp——功能是把 str1 和 str2 进行比较,最多比较前 n 个字节,若str1与str2的前n个字符相同,则返回0;若s1大于s2,则返回大于0的值;若s1 小于s2,则返回小于0的值。

六级标题
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值