#include<stdio.h>
int main(){
int data[]={1,2,3,4,5};
char cdata[]={'h','e','l','l','o'};
char cdata2[]="hello";//字符串变量
char *pchar=cdata2;//字符串常量,不允许被修改
int i;
printf("%s\n",pchar);
puts(pchar);
/*
for(i=0;i<5;i++){
printf("%c",*(pchar+i));
}
*/
return 0;
}
2.字符串和字符数组的区别
字符串后会有一个 ‘ \0 ’ ,是字符串结束的标志
3.sizeof和strlen的区别
sizeof会计算所有字符的长度,包括结束标志 \0
strlen计算有效字符的长度,不包括结束标志 \0
补充:若是指针,用sizeof的结果是8,而不是字符串的有效长度,因为指针存放的是地址,用8个字节来存储
4.动态开辟字符串
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(){
char *p;
p=(char *)malloc(1);
*p='c';
free(p);
p=NULL;
p=(char *)malloc(12);//动态开辟
if(p==NULL){
printf("error ");
exit(-1);
}
memset(p,"\0",12);//将p里的数据清空成\0
printf("扩容地址:%x\n",p);
int len=strlen("hello aaaaaaaaaaaaaa");
int newlen=len-12+1;
realloc(p,newlen);//扩容函数
printf("扩容后地址:%x\n",p);
strcpy(p,"hello aaaaaaaaaaaaaa");
puts(p);
puts("end");
return 0;
}
5.strcpy字符串复制函数
#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;
}
int main(){
char str[128]={'\0'};
char *p="abcdefghigklmn";
myStrcpy(str,p);
puts(str);
return 0;
}
6.断言函数assert
所在头文件:<assert.h>
函数原型:void assert (int expression);
参数:expression即要检测的表达式
返回值:无返回值
如果expression的结果为 0(条件不成立),那么断言失败,表明程序出错,assert() 会向标准输出设备(一般是显示器)打印一条错误信息,并调用 abort() 函数终止程序的执行。
如果expression的结果为非 0(条件成立),那么断言成功,表明程序正确,assert() 不进行任何操作。
7.strcat字符串拼接函数
#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;
}
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]="666";
char *p2;
char *p="abcdefghigklmn";
p2=myStrcat3(str,p);
//p2=strcat(str,p);
//puts(str);
puts(p2);
return 0;
}
8.strcmp字符串比较函数
#include<stdio.h>
#include<string.h>
#include<assert.h>
int myStrcmp(char *str1,char *str2){
int ret;
int n_str1=0;
int n_str2=0;
char *bakStr1=str1;
char *bakStr2=str2;
while(*str1){
n_str1+=*str1;
str1++;
}
while(*str2){
n_str2+=*str2;
str2++;
}
if(*str1||*str2){
str1=bakStr1;
str2=bakStr2;
while(*str1&&*str2&&(*str1==*str2)){
str1++;
str2++;
}
}
ret=n_str1-n_str2;
if(ret<0){
ret=-1;
}
if(ret>0){
ret=1;
}
return ret;
}
int main(){
char *p1="aaam";
char *p2="aaba";
int ret=myStrcmp(p1,p2);
if(ret==0){
puts("一样");
}
printf("RET=%d\n",ret);
return 0;
}