字符串
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;
}