首页 > 其他分享 >字符指针及其函数的使用

字符指针及其函数的使用

时间:2023-12-06 15:15:26浏览次数:29  
标签:字符 函数 ++ char printf 字符串 指针

字符指针

一、字符指针的有关内容

首先需要明确的是,字符串实际就是字符数组。比如说:

char p="hello world";

实际上应该是:

p={'h','e','l','l','o',' ','w','o','r','l','d','\0'};

因此在定义字符串时,我们需将其看作是数组,也就是说:

p <=> p[]
p[1] <=> *(p+1)

这些是等价的
image
如上图所示
同时,在表示函数的参数时,下面二者表述等价。

(char p,char q)
(char *p,char *q)

本质上都是传入了字符串的首地址

二、对字符指针进行操作的函数

先贴一个主函数在这里:

main()
{
	char a[] = "hello world111";
	char b[] = "hello world22";
	char c[] = "hello world";
	char *str=c;
	int len1,len2,len3,m;

	printf("at first\na=%s\nb=%s\nstr=%s\n\n", a,b,str);

	len1=strlen(a);
	len2=strlen(b);
	len3=strlen(str);
	printf("The length of a is %d\n",len1);
	printf("The length of b is %d\n",len2);
	printf("The length of str is %d\n\n",len3);

	m=strcmp(a,b);
	if(m==0) printf("a=b\n\n");
		else printf("a!=b and a minus b is %d\n\n", m);

	strcpy(b, str);
	printf("after copying str to b, b = %s\n\n", b);

	strcat(a,b);
	printf("after linking b to the a,a = %s\n", a);

}
对于字符串,我们通常需要进行以下操作:

1.测量字符串的长度(不含'\0'):strlen函数

具体原理是逐个扫描,扫描到'\0'字符为止

int strlen(char *s)
{
	for(int i=0;*s++;i++);
	return i;
}

2.比较两个字符串是否“相等”:strcmp函数

这里的相等指的是每一个字符(直到'\0\为止)都相等。
如果字符串相等,则返回0;
如果不相等,则比较第一次出现不同的字符的ASCII码并相减,并返回差值(前者减后者)
函数如下:

int strcmp(char *s, char *t)
{
	while(*s++==*t++ && *s!='\0');
	return (*(--s)-*(--t));
}

3.将一个字符串的所有内容“复制粘贴”到另一个字符串中:strcpy函数

需要注意的是,strcpy函数通常是将较“短”的字符串复制粘贴到较“长”的函数中,否则可能会出问题(不然我de了一晚上的bug哪来的)
经过一次次的化简之后:

void strcpy(char *s, char *t)
{
	while (*s++ = *t++);
}

(ps.第一次感受到了代码简洁的美)

4.将一个字符串中的内容“连接”在另一个的后边:strcat函数

原理是先令被连接字符串的指针先指向自己的'\0'处,再进行连接。

void strcat(char *s, char *t)
{
	while(*s++!='\0');
	s--;
	while(*s++=*t++);
}

以上便是4个常用的利用字符指针对字符串进行的函数操作。(拖了好长时间终于想起写这个了)

标签:字符,函数,++,char,printf,字符串,指针
From: https://www.cnblogs.com/zekang666/p/17879572.html

相关文章

  • java字符串String类的常用方法
    java字符串String类的常用方法字符串的创建:(1)定义字符串直接赋值,在字符串池中开辟空间()Stringstr1=“Hello”;//在字符串池中写入字符串"hello"Stringstr2=“Hello”;//直接引用字符串池中的"Hello"System.out.println(str1==str2);//地址相同,输出:true(2)使用new关键字......
  • 从字符串中分离文件路径,文件名及文件扩展名
    从字符串中分离文件路径,文件名及文件扩展名如一个文件:D:\文档\C#BASE\StringBuilder.md要分离出文件路径:D:\文档\C#BASE\文件名:StringBuilder文件扩展名:md这是我们要拿到“\”和“.”这两个字符最后出现的索引stringpath="D:\文档\C#BASE\StringBuilder.md";inti=path.la......
  • 多重继承下的虚函数调用
    C++中虚函数调用采用所谓的虚函数表(vtable)实现,对于简单的单继承,其实现如下图所示:(其中ClassA为ClassB的基类,详见深入浅出MFCP68)你也许会想到:C++支持多继承,在多继承的情况下,vatble以及内存布局该如何实现?以下也许就是你想要的答案代码:C继承于A和B,运行环境VC6.0classA......
  • 特殊不可见字符Unicode编码
    unicode显示符号\u2000 \u2001 \u2002 \u2003 \u2004 \u2005 \u2006 \u2007 \u2008 \u2009 \u200a \u200b​\u200c‌\u200d‍\u200e‎\u200f‏\u2010‐\u2011‑\u2012‒\u2013......
  • C#中如何去掉字符串所有空格
    在字符串操作中Trim方法只能去掉字符串对象前端和后端的空格,但是,如果空格出现在中间如何去除呢?这里可以使用StringBuilder来操作字符串,StringBuilder操作字符串无疑是最为方便高效的。现在利用StringBuilder类中的Replace方法去掉字符串中所有的空格。replace替换stringstr......
  • Guava中的函数式编程
    第1章:引言大家好!今天小黑要和咱们聊聊,在Java中使用Guava来进行函数式编程。首先,让我们来聊聊什么是函数式编程。简单来说,函数式编程是一种编程范式,它将计算视为函数的评估,避免使用程序状态和可变数据。在函数式编程中,函数是“一等公民”,意味着它们可以像任何其他数据一样被传递......
  • 无涯教程-Erlang - list_to_atom函数
    此方法用于将列表项转换为原子。list_to_atom-语法list_to_atom(listvalue)listvalue - 这是需要转换为原子的列表值。list_to_atom-返回值基于列表值输入的原子。-module(helloLearnfk).-export([start/0]).start()->io:fwrite("~p~n",[list_to_atom("a......
  • 无涯教程-Erlang - is_atom函数
    此方法用于确定术语是否确实是原子。is_atom-语法is_atom(term)term - 这是需要判断其是否为原子的值。is_atom-返回值如果条件值是一个原子,则返回true,否则将返回false。-module(helloLearnfk).-export([start/0]).start()->io:fwrite(atom1),io:fw......
  • 带通配符的字符串匹配
     http://ica.openjudge.cn/function1/3/   constintN=1004;intn,m,f[N][N];chara[N],b[N];signedmain(){ inti,j; cin>>a+1>>b+1; n=strlen(a+1);m=strlen(b+1); for(i=1;i<=n;i++) if(a[i]=='*')f[i][0]=1; ......
  • 无涯教程-Erlang - is_dir函数
    此方法用于确定目录是否确实是目录,此方法是filelib库的一部分。is_dir-语法is_dir(directoryname)directoryname - 这是目录名,是否为目录名。is_dir-返回值是的,如果目录存在并且确实是目录。-module(helloLearnfk).-export([start/0]).start()->io:fwrit......