目录
1.字符串就是字符串数组
指针与字符串 char *d=”hello”; 的理解。//只能和字符串这么用,字符不行
这里不是把字符串”hello”赋值给指针d,是创建一个字符串常量“hello”,并把这个字符串常量的第一个字符的地址传给d。
访问方式可以用数组的下标法访问和指针偏移访问
printf(“%c”,”hello”[i]) = printf(“%c”,d[i]) =printf(“%c”,*(d+i))
使用指针与字符串的好处:可以先定义一个指针再给字符串不用初始化,用char c[]=”sdd”必须初始化。
#include <stdio.h>
int main(viod)
{
int a[]={1,2,3,4};
char b[]={'h','e','l','l','o'};
char c[]={"hello"}; //char c[]={"hello"} char c[]={"hello " " nihao \n"}
char *d="hello"; //由指针定义的是常量,不能修改
printf("%s \n",b);
printf("%s \n",c);
printf("%C \n",*d); //只能单个c打印 *(d+i)
c[3]='m'; //可以修改字符串的值
printf("%s \n",c);
//*d='m'; //但是不能通过指针修改字符串的值
printf("222 %c",*(d+4));
return 0;
}
2.字符串结尾为‘\0’
#include <stdio.h>
int main(viod)
{
int a[]={1,2,3,4};
char b[]={'h','e','l','l','o'};
char c[]={"hello"}; //char c[]={"hello"} char c[]={"hello " " nihao \n"}
int len;
len=sizeof(b)/sizeof(b[0]);
printf("len的长度是%d \n",len);
len=sizeof(c)/sizeof(c[0]); //两个字串的长度不一样,因为一起定义的字符串会在后边加‘\0’作为结束标志
printf("len的长度是%d \n",len);
return 0;
}
3.sizeof() 与strlen()
#include <stdio.h>
int main(viod)
{
char cdata[128]={"hello"}; //char c[]={"hello"} char c[]={"hello " " nihao \n"}
char *p="hello";
printf("sizeof(cdata)的长度是%d \n",sizeof(cdata));
printf("strlen(cdata)的长度是%d \n",strlen(cdata)); //strlen 只显示有效字符的长度
printf("sizeof(p)的长度是%d \n",sizeof(p));
printf("strlen(p)的长度是%d \n",strlen(p)); //strlen 显示指针字符的所有长度
printf("sizeof(int *)的长度是%d \n",sizeof(int *));
printf("sizeof(char *)的长度是%d \n",sizeof(char *));
return 0;
}
4.动态开辟内存空间malloc
开辟动态内存空间 void *malloc(size_t/size)
释放动态内存空间 viod free(viod *p)
增加动态内存空间 void *realloc(viod *ptr,zise_t/size)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(viod)
{
char *p;
//p='c'; //这是野指针,不知道里面存放的地址是什么,不可以修内容
//p=Null ;
p=(char *)malloc(1); //开辟一个动态内存空间
*p='w';
printf("%c \n",*p);
free(p); //释放动态内存空间
p=(char *)malloc(1); //开辟一个动态内存空间
realloc(p,50); //再增加动态内存空间 50为什么是多少都可以
p="sda12345678s"; //指针p接受字符串常量 "sda12345678s" 中第一个元素s的地址
putchar(*p);
puts("\n");
puts(p);
return 0;
}
5.字符串输入输出
printf puts scanf
#include <stdio.h>
int main(viod)
{
int *p;
char str[12]={'\0'};
p="chelizi";
printf("%s \n",p);
puts(p); //会打印整个字符串数组
printf("请输出字符串:\n");
scanf("%s",str);
printf("%s",str);
return 0;
}
6.拷贝字符串
strncpy(str,p,6);
char *strncpy(char *dest, const char *src, int n)
表示把src所指向的字符串中以src地址开始的前n个字节复制到dest所指的数组中,并返回被复制后的dest。
#include <stdio.h>
int main(viod)
{
char *p;
char str[7]="chelizi";
char *strpy;
p="chelizi";
printf("%s \n",p);
puts(str); //会打印整个字符串数组
strncpy(strpy,p,5); //字符串复制
printf("%s",strpy); //字符串打印
return 0;
}
自己写复制字符串函数
#include <stdio.h>
void *strpypy(char *desk,char *p)
{
while(*p!='\0'){
*desk=*p;
desk++;
p++;
}
*desk='\0';
}
int main(viod)
{
char *p;
char str[7]="chelizi";
char *strpy;
p="chelizi";
strpypy(strpy,p);
printf("%s",strpy) ;
return 0;
}
7.assert 函数(断言)
#include “assert.h”
viod assert( 表达式);
作用:表达式为真,之后的程序才会运行。
缺点:频繁使用会增加开销,影响性能。
8.字符串拼接
函数原型: char *strcat(char *desk, cahr *str );
#include <stdio.h>
#include <string.h>
char *mystrcat(char *desk,char *str)
{
int i;
char *first=desk;
i=strlen(desk);
desk=desk+i;
while(*str!='\0'){
*desk=*str;
desk++;
str++;
}
*desk='\0';
desk=first;
return desk;
}
int main(viod)
{
char p[20]="chelizi "; // char *p="chelizi"; 这种指针定义的是常量字符串不能修改
char *str="delicious";
char *p2;
p2=mystrcat(p,str);
//strcat(p,str); //系统用的函数
puts(p2);
printf("%s",p2) ;
return 0;
}
9.字符串比较strcmp
函数原型:int strcmp(const char *str1,const char *str2);
若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数
10.字符串初始化
函数原型 memset(void *s, int ch,size_t n);
int a[5];
赋值memset(a,-1,sizeof(int )*5) 或者memset(a,-1,sizeof(a))
意思就是将a的内存空间内的值都初始化为-1;int 类型和char类型都可以。