C语言(第3篇)——字符串

目录

1.字符串就是字符串数组

2.字符串结尾为‘\0’

3.sizeof() 与strlen()

4.动态开辟内存空间malloc

5.字符串输入输出

6.拷贝字符串

7.assert 函数(断言)

8.字符串拼接

9.字符串比较strcmp

10.字符串初始化


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类型都可以。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值