第七章字符串
1、char str【】=“hello”; 字符串变量,可以修改
char *p=“hello”; 字符串常量,不可修改
char *p; 野指针
p=NULL; 空指针
2、对没有明确指向内存的野指针赋值会中断例如: char *p; *p=‘a’;
但是 char *p; p=(char *)malloc(12);*p=‘a’;就行了
3、字符串结束标志‘\0’,
char str【】=“hello”;
int len =sizeof(str)、sizeof(str【0】)=6;系统会自动添加\0;
strlen(str)=5; strlen计算的是有效字符长度
4、char *p;
malloc 使用malloc函数要添<stdlib.h> p= (char *)malloc(12);
malloc实在堆区开创内存,内存只有在程序结束时才会被系统默认释放,所以需要自行用free释放; free(p);p=NULL;
realloc(p,int)在原有基础上再扩充n个字节内存
memset(p,‘\0’,12);将p中的12个字符变为\0
悬挂指针 :野指针的一种 char*p;p=NULL;
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(){
char *p; //野指针
p=(char *)malloc(1); //p有了具体的内存指向
*p='c';
free(p); //malloc 是在堆区创建内存,之后程序结束只有系统才会释放内存,使用之后需要手动free释放掉内存
p=NULL;
p=(char *)malloc(12);
if(p==NULL){
puts("malloc error!!!");
exit(-1); //退出程序,需要添加stdlib头文件
}
memset(p,'\0',12); //将p所指的内存全部初始为\0;
printf("扩容地址:%x\n",p);
int len=strlen("1234567890123456");
int newlen=len-12+1; //加1是为了给\0留个位置
realloc(p,newlen); //realloc给p所指的内存空间额外增加newlen个空间
printf("扩容后地址: %x\n",p);
strcpy(p,"1234567890123456"); //strcpy(n1,n2)将n2复制到n1,需要加<string。h>,字符串赋值需要用到复制
printf("%s\n",p ); //输出字符串,直接传入p指针即可,类似于数组名,不需要*截引用,如果要输出字符串中的字符,则输出%c ,*p;
puts(p);
return 0;
}
5、常见api
#include<stdio.h>
int main(){
char *p="baoshuaizuishuai";
char str[128]={'\0'}; //初始化赋值
puts(p);
printf("%s\n",p);
puts("请输入字符串: ");
// scanf("%s",str);
gets(str); //输入字符串
puts(str); //输出字符串,自带换行符
return 0;
}
6、mystrcpy
#include<stdio.h>
char * mystrcpy1(char *str,char *p){
if(str==NULL||p==NULL) //assert(str!=NULL&&p!=NULL); assert判断如果 为假,就会调用abort函数终止程序,但需要<assert.h>
return NULL;
char *des=str;
while(*p!='\0'){
*str++=*p++;
}
*str='\0';
return des;
}
char * mystrcpy2(char *str,char *p){
if(str==NULL||p==NULL)
return NULL;
char *des=str;
while((*str++=*p++)!='\0');
*str='\0';
return des;
}
char* mystrncpy(char *str,char *p,int n ){
if(str==NULL||p==NULL){
return NULL;
}
char *des=str;
while(*p!='\0'&& n>0){
*str++=*p++;
n--;
}
if(n>0){
while(n>0){
*str='\0';
n--;
}
return des;
}
*str='\0';
return des;
}
int main(){
char str[128]={'\0'};
char *p="wozhenniubi";
mystrncpy(str,p,2);
puts(str);
return 0;
}
7mystrcat
#include<stdio.h>
#include<assert.h>
#include<string.h>
char* mystrcat1(char *str,char *p){
assert(str!=NULL&&p!=NULL);
char *des=str;
while(*str!='\0')
str++;
while(*p!='\0')
*str++=*p++;
*str='\0';
return des;
}
char* mystrcat2(char *str,char *p){
assert(str!=NULL&&p!=NULL);
char *des=str;
while(*str!='\0')
str++;
while((*str++=*p++)!='\0');
*str='\0';
return des;
}
char* mystrcat3(char *str,char *p){
assert(str!=NULL&&p!=NULL);
char *des=str;
strcpy(str+strlen(str),p);
return des;
}
int main(){
char str[128]="baoshuai";
char *p=" zuishuai";
mystrcat2(str,p);
puts(str);
return 0;
}
8、对字符串数组赋值要用strcpy;