C语言基础-字符串

1、字符串

普通方式:char a[] = "ABC"; 

指针方式:char *pchar = "ABC";

#include <stdio.h>

int main()
{
	/*
	char a[] = "ABC";
	int i;
	for(i=0;i<4;i++)
	{
		printf("%c",a[i]);
	}
	*/
	//指针方式
	char *pchar = "ABC";
	int i;
	for(i=0;i<4;i++)
	{
		printf("%c",*(pchar+i));
	}
    //字符串输出采用下面的方式,%s
    printf("%s\n",pchar);
	putchar('\n');   //此括号内为单引号!!!
	puts(pchar);
}

char a[] = "ABC";  与   char *pchar = "ABC";  的区别:

前者为字符串变量,可以修改;后者为字符串常量,只能使用,不可修改。

2、 字符串的结束标志:'\0' 

3、sizeof 与 strlen 的区别

strlen:计算有效字符的大小


#include <stdio.h>
#include <string.h>

void test()
{

}

int main()
{
	char a[128] = "Hello";
	printf("sizeof = %d",sizeof(a));                   //128
	printf("strlen = %d",strlen(a));                   //5
	


	char *p = "hello";
    //p是一个char *(char型指针),sizeof来计算的时候,得出的是计算机用多少字节来表示一个地址
	printf("sizeof(p):        %d\n",sizeof(p));        //8
	printf("sizeof(char *):   %d\n",sizeof(char *));   //8
	printf("sizeof(char):     %d\n",sizeof(char));     //1
	printf("strlen:           %d\n",strlen(p));        //5

	

    void (*ptest)();
    ptest = test;
    printf("sizeof:ptest      %d\n",sizeof(ptest));    //8
}

4、动态开辟字符串空间

①malloc

        —函数原型 void *malloc(size_t size)

        —C库函数void *malloc(size_t size)分配所需的内存空间,并返回一个指向它的指针

②realloc

        —函数原型 void *realloc(void *ptr,size_t size)

        —扩容

        —C库函数 void *realloc(void *ptr,size_t size)尝试重新调整之前调用malloc或calloc所分配的ptr指向的内存块的大小

③free

        —C库函数 void free(void *ptr)释放之前调用calloc、malloc或realloc所分配的内存空间

        —释放,防止内存泄漏

        —防止悬挂指针(野指针的一种)

④strcpy与strncpy

        —拷贝

        —strcpy函数原型 char *strcpy(char *dest,const char *src);(目标地址,内容地址)

        —strncpy函数原型 char *strncpy(char *dest,const char *src,int n);(目标地址,内容地址,拷贝几个字符)

⑤memset

        —清理malloc所申请的空间

        —函数原型 void *memset(void *str,int c,size_t n);

        —eg:memset(p,'\0',10);参考下例,把第二次malloc的空间全部初始化为\0

#include <stdio.h>
#include <string.h>
#include <stdlib.h> 
int main()
{
	char *p;//野指针,未知指向
	p = (char *)malloc(1);//p有了具体的内存指向
	*p = 'a';
	free(p);//释放
	p = (char *)malloc(10);//重新分配10个
	printf("扩容前地址:%x\n",p);
	int len = strlen("wahaha87463849282368429429");//计算所需大小
	int newlen = len - 10 + 1;//计算需要扩容多少,加一是为了给结束标志\0
	realloc(p,newlen);//扩容操作
	printf("扩容后地址:%x\n",p);
	strcpy(p,"wahaha87463849282368429429");//拷贝
	puts(p);
	return 0;
	
}

悬挂:指针所指向的对象已经被释放或者回收了,但是指向该对象的指针没有作任何的修改,仍旧指向已经回收的内存地址。

5、字符串常用API

①输出字符串

        —puts(" ");

        —printf("%s",p);

②获取字符串 

        —char *gets(char *str);

        —scanf("%s",p);

③断言(assert)

        —断言用法详解

④拼接(strcat)

        —函数原型 char *strcat(char *dest,const char *str); 

        —把src所指向的字符串(包括"\0")复制到dest所指向的字符串后面(删除*dest原来末尾的"\0")。要保证*dest足够长,以容纳被复制进来的*src。*src中原来的字符不变,返回指向dest的指针。

#include <stdio.h>
#include <string.h>

int main()
{
	char str[33] = "欢迎";
	char *p = "光临";
	strcat(str,p);
	puts(str);
	return 0;
}

⑤比较

        —strcmp函数原型 int strcmp(const char *str1,const char *str2);

        —若str1 = str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数

        —strncmp函数原型 int strncmp(const char *str1,const char*str2,size_t n);

        —把str1与str2比较,最多比较前n个字节,若str1与str2的前n个字节相同,则返回0;若str1>str2,则返回大于0的值;若str1<str2,则返回小于0的值。

        

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值