字符串的定义
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——函数原型voidrealloc(voidptr,size_t size)——
尝试重新调整之前调用 malloc 或 calloc 所分配的 ptr 所指向的内存块的大小。
free—— 释放之前调用 calloc、malloc 或 realloc 所分配的内存空间;防止悬挂指针——野指针的一种
memset——函数原型——清理空间voidmemset(voidstr,int c,size_t n)
voidst——初始化首内存的地址
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的值。