C语言之通过指针操作字符串

下面我们来学习通过指针来灵活操作字符串的方法


判断字符串的长度

我们用对指针的遍历来实现判断字符串的长度

#include <stdio.h>
int str_length(const char*s)
{
	int len = 0;
	
	while(*s++)
		len++;
	
	return len;
}
int main()
{
	char str[128];
	
	printf("请输入字符:");
	scanf("%s", str);
	
	printf("输入的字符串\"%s\"长度为%d\n", str, str_length(str));
	
	return 0;
}

在函数形参的声明中由使用[ ]变为*,这些声明方式是一样的,只是表面上的一些变化,实质上并没有什么变化。

程序中发生实质性变化的事函数体,让我们结合下图来看(以输入的字符串five为例):

b5456038d8ff4898813592b00639d688.png

函数开始执行时,s指向所接收的字符串str第一个字符str[0],即“five”中的f,当*s为0(null字符)时,while循环结束,因此在没有遇到null字符时,指针s和变量len都会递增。

指针s在判断循环表达式中递增,变量len在循环体中递增

注意

指向数组元素的指针递增后指向下一个元素,递减后指向上一个元素。 

p++即p=p+1;p--=p-1

这里的str_length函数中并没有使用下标运算符,而是使用了指针运算符 *和递增运算符++,这种技巧很常用,大家一定要好好理解。


字符串的复制

#include<stdio.h>

char* str_copy(char *d, const char *s)
{
	char *t = d;
	while(*d++ = *s++)
		;
	return t;
}
int main()
{
	char str[128] = "ABC";
	char tmp[128];
	
	printf("str = \"%s\"\n", str);
	
	printf("复制的是:");
	scanf("%s", tmp);
	
	str_copy(str, tmp);
	
	puts("复制了。");
	printf("str = \"%s\"\n", str);

	return 0;
}

我们首先来看str_copy函数中内实现字符串复制功能的while语句,控制表达式*d++ = *s++是比较复杂的。后置递增运算符++在对左操作数进行判定后会进行递增,因此控制表达式的判定和执行分为两个阶段(以str=ABC, tmp=abc为例):

①通过*d = *s进行赋值

指针s指向的字符会赋值给指针d指向的字符

②指针d和指针s递增

赋值结束后,指针d和s分别指向下一个字符。

③结果判断

对指向的指针所指向的字符进行判断,若指向的是null字符,while语句循环结束,否则就重复①和②两步直至指向null字符。

我们用图来表示:(剩下的步骤是重复的)

19ee677635374b5397054f89544f0b3b.png

复制时不同语句的写法

 我们还可以对指针d和s使用下标运算符,如下:

while(d[i] = s[i])
	;
i++;

与上面代码相比,该上面使用指针运算符的程序具有以下优点:

不需要用于下标的变量i,可以节约少量内存

运行效率有望更高


不正确的字符串赋值

下面的程序与上面的程序大致相同,str_copy函数一样,main函数有所不同:

#include<stdio.h>

char* str_copy(char *d, const char *s)
{
	char *t = d;
	while(*d++ = *s++)
		;
	return t;
}
int main()
{
	char* str = "ABC";
	char tmp[128];
	
	printf("str = \"%s\"\n", str);
	
	printf("复制的是:");
	scanf("%s", tmp);
	
	str_copy(str, tmp);
	
	puts("复制了。");
	printf("str = \"%s\"\n", str);

	return 0;
}


这个程序犯了两个错误

改写了字符串字面量

这个程序改写了指针str指向的字符串字面量的内容,但是,是否可以更改是取决于编译器,在不支持改写字符串字面量的编译器中,该程序不能正常运行。

可能会写入非空的内存空间

指针str指向了字符串字面量的“ABC”中的第一个字符,该字符串包括null字符在内长度为4位,在进行复制时,不能保证复制所需要的内存空间是空着的,在该内存空间甚至是保存着系统的关键信息

所以,进行复制时有可能会破坏其他变量的值,甚至会导致程序运行异常。

注意

不要改写字符串字面量,也不用对超过字符串字面量的内存单元进行写入操作。


返回指针的函数

str_copy函数的返回值类型是指向char型变量的指针型,只要是用到这种数据类型的地方都能调用该函数。

函数的返回值是t,它复制于传入的形参t,这就意味着函数返回的是“指向复制后的字符串中的第一个字符的指针”。


关于指针的基础知识学习我们就已经学习完了,在学完基础篇后我们会进行更加深入的学习,来打好更加深厚的基础。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/333930.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

猫咪增肥发腮吃什么?适合猫咪增肥发腮的猫罐头推荐

冬天开始了&#xff0c;北方的小猫咪们有暖气还好过一些&#xff0c;南方的猫咪就只能依靠自己的抵抗力来过冬了。如果不囤点肉肉&#xff0c;怕冷的小猫咪要怎么过冬啊&#xff1f;有些猫咪无论怎么吃也吃不胖&#xff0c;真的很让铲屎官烦恼。 作为一个开宠物店6年了的铲屎官…

温故而知新:直方图均衡、直方图匹配的再次理解

☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython 引言 数字图像处理的知识在2年前学过一阵子&#xff0c;但没学完&#xff0c;后来基于各种原因就停滞了整整2年没有学习了&#xff0c;现在准备重新开始&#xff0c;为此把以前学习写的总结博文翻出来重新进…

初识VUE

文章目录 Vue是什么1.创建一个Vue实例2.插值表达式{{ }}3.Vue的响应式特性4.开发者工具的安装 Vue是什么 概念&#xff1a;Vue是一个用于构建用户界面的渐进式框架 ①构建用户界面&#xff1a;基于数据渲染出用户看到的界面 ②渐进式&#xff1a;循序渐进 ③ 框架&#xff1…

【每日一题】2809. 使数组和小于等于 x 的最少时间-2024.1.19

题目&#xff1a; 2809. 使数组和小于等于 x 的最少时间 给你两个长度相等下标从 0 开始的整数数组 nums1 和 nums2 。每一秒&#xff0c;对于所有下标 0 < i < nums1.length &#xff0c;nums1[i] 的值都增加 nums2[i] 。操作 完成后 &#xff0c;你可以进行如下操作&…

什么是区块链?

区块链 区块链 &#xff08;英语&#xff1a;blockchain&#xff09;是借由 密码学 与 共识机制 等技术建立&#xff0c;存储数据的 保证不可篡改和不可伪造的 分布式技术。 什么是区块 区块 就是将一批数据打包在一起&#xff0c;并且给打包出来的区块编号。第一个区块的编…

北斗导航 | 基于恒定虚警率算法的接收机自主完好性监测(附Matlab代码)

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 基于恒定虚警率算法的接收机自主完好性监测 输入输出外部引用代码参考…

基于springboot+vue的旅游网站系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

Java Springboot SSE如何判断客户端能否正常接收消息

目录 背景解决方案思路代码代码解释 Java反射知识点补充 背景 当新建一个 emitter 对象的时候, 它的默认超时时间是 30s. SseEmitter emitter new SseEmitter(); 但是很多情况下, 默认30s的时间太短, 需要把 emitter 对象的超时时间设置成不超时, 也就是永久有效. private …

Proxifier海外動態IP代理工具使用教程

Proxifier是一款多平臺代理客戶端&#xff0c;能讓不支持代理伺服器的程式正常運行。它支持各種操作系統和代理協議&#xff0c;並允許自定義端口和應用程式代理設置。用戶可以將其與代理伺服器集成&#xff0c;從而最大程度釋放性能效果。 本文將對其進行全面的概述&#xff…

Docker 安装 MySQ

Docker 安装 MySQL MySQL 是世界上最受欢迎的开源数据库。凭借其可靠性、易用性和性能&#xff0c;MySQL 已成为 Web 应用程序的数据库优先选择。 1、查看可用的 MySQL 版本 访问 MySQL 镜像库地址&#xff1a;https://hub.docker.com/_/mysql?tabtags 。 可以通过 Sort b…

上海亚商投顾:沪指冲高回落 旅游板块全天强势

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日冲高回落&#xff0c;创业板指跌近1%&#xff0c;北证50指数跌超3%。旅游、零售板块全天强势&#xf…

Red Hat Enterprise Linux 7.9 安装图解

引导和开始安装 选择倒计时结束前&#xff0c;通过键盘上下键选择下图框选项&#xff0c;启动图形化安装过程。需要注意的不同主板默认或者自行配置的固件类型不一致&#xff0c;引导界面有所不同。也就是说使用UEFI和BIOS的安装引导界面是不同的&#xff0c;如图所示。若手动调…

29、WEB攻防——通用漏洞SQL注入增删改查盲注延迟布尔报错

文章目录 盲注增删改查 盲注 概念&#xff1a;在注入过程中&#xff0c;获取的数据不能回显至前端页面&#xff0c;此时我们需要利用一些方法进行判断或尝试&#xff0c;这个过程被称为盲注。 解决&#xff1a;常规的联合查询注入不行的情况。 分类&#xff1a; 基于布尔的SQ…

【51单片机系列】proteus中的LCD12864液晶屏

文章来源&#xff1a;《单片机C语言编程与Proteus仿真技术》。 点阵字符型LCD显示模块只能显示英文字符和简单的汉字&#xff0c;要想显示较为复杂的汉字或图形&#xff0c;就必须采用点阵图型LCD显示模块&#xff0c;比如12864点阵图型LCD显示模块。 文章目录 一、 LCD12864点…

【算法】串联所有单词的子串【滑动窗口】

题目 给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。例如&#xff0c;如果 words ["ab","cd","ef"]&#xff0c; 那么 "abcd…

milkv-duo cvi-mmf 硬件加速 JPG 解码性能测试

前言 本文是基于 nihui 老师的 opencv-mobile 对其支持 milkv-duo cvi-mmf 硬件加速 JPG 解码的测试。 nihui 老师原文章如下&#xff1a;opencv-mobile 现已支持 milkv-duo cvi-mmf 硬件加速 JPG 解码 opencv-mobile 仓库地址如下&#xff1a;nihui/opencv-mobile: The minim…

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例4-3 textarea

代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>textarea</title> </head><body> <h2>多行文本框:</h2> <!--textarea&#xff08;文本域&#xff09;cols(列) rows(行)--> …

Spring Web文件上传功能简述

文章目录 正文简单文件上传文件写入 总结 正文 在日常项目开发过程中&#xff0c;文件上传是一个非常常见的功能&#xff0c;当然正规项目都有专门的文件服务器保存上传的文件&#xff0c;实际只需要保存文件路径链接到数据库中即可&#xff0c;但在小型项目中可能没有专门的文…

微信这个费用,终于降低了

大家好&#xff0c;我是小悟 这个费用降低了&#xff0c;这对于广大小程序开发者来说无疑是一个好消息。这一举措不仅可以降低开发者的成本&#xff0c;还有助于激发更多的创新和创业激情。 对于广大小程序开发者来说&#xff0c;这也是一个福音&#xff0c;因为他们可以降低开…

Pypputeer自动化

Pyppeteer简介 pyppeteer 是 Python 语言的一个库&#xff0c;它是对 Puppeteer 的一个非官方端口&#xff0c;Puppeteer 是一个 Node 库&#xff0c;Puppeteer是Google基于Node.js开发的一个工具&#xff0c;它提供了一种高层次的 API 来通过 DevTools 协议控制 Chrome 或 Ch…