一、字符串的引入和注意事项
二、字符串的内存存放方式及结束标志
字符串和字符数组的区别
请计算数组data的元素个数
int main()
{
int data[]={1,2,3,4,5};
char cdata2[]="hello";
int len=sizeof(data)/sizeof(data[0]);
printf("len = %d\n",len);
len=sizeof(cdata2)/sizeof(cdata2[0]);
printf("len = %d\n",len);
return 0;
}
int main()
{
int data[]={1,2,3,4,5};
char cdata[5]={'h','e','l','l','o'};
char cdata2[]="hello";
int len=sizeof(data)/sizeof(data[0]);
printf("len = %d\n",len);
len=sizeof(cdata2)/sizeof(cdata2[0]);
printf("len = %d\n",len);
len=sizeof(cdata)/sizeof(cdata[0]);
printf("len = %d\n",len);
return 0;
}
字符串的结束标志‘\0’
三、sizeof和strlen的区别
void test()
{
}
int main()
{
char cdata[64]="hello";
char *p="hello";
void (*ptest)();
printf("sizeof :%d\n",sizeof(cdata));
printf("sizeof :%d\n",strlen(cdata));
//p是一个char *,sizeof来计算的时候,得出是计算机用多少字节来表示一个地址
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 test:%d\n",sizeof(ptest));
printf("sizeof:%d\n",strlen(p));//有效字符长度
return 0;
}
四、malloc动态开辟内存空间
malloc:
函数原型 void *malloc(size_t size)
分配所需内存空间并返回一个指向他的指针
int main()
{
char *p;//野指针
*p='c';
puts("end");
return 0;
}
运行此代码,由于是野指针,没有具体指向哪个内存空间,不执行,如下图
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
char *p;//野指针
p=(char *)malloc(1);//p有了具体的内存指向
*p='c';
puts("end");
printf("%c\n",*p);
return 0;
}
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
char *p;
p=(char *)malloc(1);//p有了具体的内存指向
*p='c';
free(p);
p=(char *)malloc(12);
strcpy(p,"horska");
puts(p);
return 0;
}
realloc
函数原型 void *realloc(void *ptr,zize_t size)
尝试重新调整之前调用malloc或calloc所分配的ptr所指向的内存块的大小
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
char *p;
p=(char *)malloc(1);//p有了具体的内存指向
*p='c';
free(p);
p=(char *)malloc(12);
printf("扩容地址:%x\n",p);
int len=strlen("hprskaqwertyuiop");
int newlen=len-12+1;
realloc(p,newlen);
printf("扩容后地址:%x\n",p);
strcpy(p,"horskaqwertyuiop");
puts(p);
puts("end");
return 0;
}
五、字符串拷贝函数
//C:\workspace\c
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char* myStrcpy(char *des,char *src)
{
if(des==NULL||src==NULL)
{
return NULL;
}
char *bak=des;
while(*src!='\0')
{
*des=*src;
des++;
src++;
}
*des='\0';
return bak;
}
char* myStrcpy2(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;
}
char* myStrcpy3(char *des,char *src)
{
if(des==NULL||src==NULL)
{
return NULL;
}
char *bak=des;
while((*des++=*src++)!='\0');
*des='\0';
return bak;
}
int main()
{
char str[128]={'\0'};
char *p="horska qwertyuiop";
//myStrcpy(str,p);
myStrcpy2(str,p,6);
//myStrcpy3(str,p);
puts(str);
return 0;
}
/*
int main()
{
char *p;
p=(char *)malloc(1);//p有了具体的内存指向
*p='c';
free(p);
p=(char *)malloc(12);
printf("扩容地址:%x\n",p);
int len=strlen("hprskaqwertyuiop");
int newlen=len-12+1;
realloc(p,newlen);
printf("扩容后地址:%x\n",p);
strcpy(p,"horskaqwertyuiop");
puts(p);
puts("end");
return 0;
}
void test()
{
}
int main()
{
char cdata[64]="hello";
char *p="hello";
void (*ptest)();
printf("sizeof :%d\n",sizeof(cdata));
printf("sizeof :%d\n",strlen(cdata));
//p是一个char *,sizeof来计算的时候,得出是计算机用多少字节来表示一个地址
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 test:%d\n",sizeof(ptest));
printf("sizeof:%d\n",strlen(p));//有效字符长度
return 0;
}
int main()
{
int data[]={1,2,3,4,5};
char cdata[5]={'h','e','l','l','o'};
//char cdata[5]={'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(cdata2[0]);
printf("len = %d\n",len);
len=sizeof(cdata)/sizeof(cdata[0]);
printf("len = %d\n",len);
return 0;
}
int main()
{
char *pchar="hello";
for(int i=0;i<5;i++)
{
printf("%c\n",*(pchar+i));
}
printf("%s\n",pchar);
return 0;
}
*/
六、C语言断言函数assert
#include<assert.h>
char* myStrcpy(char *des,char *src)
{
assert(des!=NULL&&src!=NULL);//断言
char *bak=des;
while(*src!='\0')
{
*des=*src;
des++;
src++;
}
*des='\0';
return bak;
}
七、字符串拼接strcat的使用及实现
char *strcat(char *dest,const char *src)
八、字符串比较strcmp的使用及实现
1、strcmp
int strcmp(const char *str1,const char *str2)
若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数
2、strncmp
int strncmp ( const char * str1, const char * str2, size_t n )
功能是把 str1 和 str2 进行比较,最多比较前 n 个字节,若str1与str2的前n个字符相同,则返回0;若s1大于s2,则返回大于0的值;若s1 小于s2,则返回小于0的值。