C语言字符串——关于指针

2023-05-16

c字符串

我们知道在关于字符串的操作函数很多都包含在头文件#include<string.h>中,例如计算字符串长度的函数strlen。今天我们们用自己的语言来实现一下关于字符串的复制,连接,和比较

strcmp()字符串比较函数的指针实现

字符串串比较的时候实际上是ASC||值的比较,因此用关系运算符比较即可

int my_strcmp(char* str, const char* src) {
	assert(*str != NULL && *src != NULL);
	while (*str = *src) {
		if (*str = '\0') {
			break;
		}
		str++;
		src++;
	}
	if (str > src) {
		return 1;
	}
	else if (str < src) {
		return -1;
	}
	else {
		return 0;
	}
}

这里我们发现了在跳出循环后的代码冗余,我们可以用一个三目运算符进行优化

int my_strcmp(char* str, const char* src) {
	assert(*str != NULL && *src != NULL);
	while (*str = *src) {
		if (*str = '\0') {
			break;
		}
		str++;
		src++;
	}
	if (str == '\0'&& src == '\0') {
		{return 0; }
	return str > src ? 1:-1;
	
	
}

经过这样的判断我们就可以得到如果str=src返回0,str>src返回1,str<src返回-1。

strcat(),字符串连接函数

我们这里可以直接使用指针访问到字符串的尾部在加上需要连接的字符串或者我们使用指针移位的方式操作,同时要注意连接前的字符串数组的大小应该要大于连接后的大小。

void my_strcat(char* p, char* q) {
	assert(p != NULL && q != NULL);
	int i = strlen(p); int j = 0;
	while (*(q + j) != '\0') {
		*(p + i) = *(q + j);
		i++; j++;
	}
	*(p + i) = '\0';

}
 char* my_strcat2(char* p, const char* q) {
	while (*p++ != '\0');
	while (*q != '\0') {
		*p++ = *q++;
	}
	*p = '\0';
}

最后比较重要的是字符串默认以\0结尾,所以不管哪种方式,我们都要在尾部加上\0。

strcpy(),字符串拷贝函数,同上一个函数一样我们在最后都需要加上字符串的默认结尾\0

void my_strcpy(char* p, char* q, int len) {
	assert(p != NULL && q != NULL);
	if (p <= q && p >= q + len - 1) {
		for (int i = 0; i < len;) {
			*(q + i) = *(p + i);
			i++;

		}
	}
	else {
		for (int j = len - 1; j >= 0;) {
			*(q + j) = *(p + j);
			j--;
		}
	}
}
char* my_strcpy(char*q,const char*p) {
	assert(*p != NULL && *q != NULL);
	while (*p != '\0'){
		*q = *p;
		q++;
		p++;

	}
	*q = '\0';
}

指针习题中的问题

1. 即使不进行强制类型转换,在进行指针赋值运算时,指针变量的基类型也可以不同

这句话显然是错误的,基类型也就是指针变量的基本类型,它反映了指针变量可以存储变量大小和+1能力,比如一个char*p int *s  p+1就是加了sizeof(char) ,而s+1就加了sizeof(int),所以在对指针进行赋值运算时,指针变量的基类型不能不相同

2.设变量p是一个指针变量,则语句p=0;是非法的,应该使用p=NULL;

在c语言中,这两者其实是相同的,0就是NULL,NULL也就是0

3. 指针变量之间不能用关系运算符进行比较 

这个也是错误的,指针变量是可以进行关系运算符的比较的。但是同一个变量但是在不同的情况下的情况也不同

 const char*s="hello";

const char*p="hello';

那么s和p的地址实际上是相同的

因为这属于字符串常量,存储的时候是存储在数据区,s会先在常量池中寻找是否有"hello",如果没有就在常量池中加入,p就会找到”hello“存储的地方并且拿到它的地址,所以s和p的地址实际上是相同的

char arr[]=”hello“;

char brr[]="hello";

在这里这两者的地址就不是相同的,因为他们是在栈中申请一块连续的内存空间存储hello\0,而我们知道,栈是从高地址往低地址分配内存空间,那么arr的地址就和brr的地址不相同

4.float a[10], x;语句 a = &x; 是非法的  

这个是正确的,这就涉及到了c语言中的函数赋值问题

例如 int arr[];

int brr[10]={1,2,3,4,5};

arr[]=brr[10];

关于数组的赋值不能只有简单的等号来进行

5.C、 可以取一个指针变量的地址赋给本指针变量,这样就使得指针变量指向自身

这个选项是错误的

例如 int *p

p=&p,这是将一个二级指针赋给一个一级指针语法上就是有问题的。

6. 指针变量所占内存的大小与其类型有关,char型指针变量只占1个字节,double型指针变量占8个字节

这个是错误的,指针的大小只和操作系统有关

7.以下不能将s所指字符串正确复制到t所指存储空间的是( )。

A、 for(i=0,j=0;t[i++]=s[j++]; );

B、 for(i=0;t[i]=s[i];i++);

C、 while(*t=*s){t++;s++;}

D、 do{*t++=*s++;}while(*s );

这个题的正确选项是D选项,因为do while是先执行在判断,这就会使其先加一再判断,就会丢失字符串末尾的\0。

8.double a[10] ,*s=a;
以下能够代表数组元素a[3]的是( )。

A、 (*s)[3]

B、 *(s+3)

C、 *s[3]

D、 *s+3

在这个题目条件下就是选择b选项

但是如果改变一下题目条件

double (*s)[4]={1,2,3,4,5,6,7,8}

(s*)[4]=a;

中的a[0][3]元素应该如何选择首先找到他的地址*(a+0)+3,在对地址解引用*(*(a+0)+3)也就是*(*a+3),将a换成s,也就是*(*s+3),那么他就和A代表的值是一样的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言字符串——关于指针 的相关文章

  • 操作系统迭代、Debian安装教程

    前言 最近在考虑公司生产环境操作系统的迭代问题 目前 xff0c 公司业务主要跑在CentOS7和8上面 xff0c 由于CentOS早已停止了7和8的支持 xff0c 新版的CentOS Stream也从RHEL的下游变成了上游 xff0
  • Debian修改DNS

    原文链接 Debian的DNS文件默认为 etc resolv conf 查看当前的DNS cat etc resolv conf 下图中画出的就是当前系统的DNS 如果想修改DNS的话 xff0c 可以直接vim 来修改文件 xff0c
  • 配置JupyterLab远程密码访问

    文章目录 部署环境配置步骤启动和连接访问启动连接访问 有些时候因为某些原因 xff08 如本地机器资源不足 数据不能离网等 xff09 xff0c 需要使用本地电脑连接远程服务器进行开发工作 xff0c 在这里记录下如何在远程Linux上配
  • linux查看 jre 安装目录

    近期对接平安银行项目 xff0c 要求放国密 jar包到jre目录 xff0c 网上也找了一些命令 xff0c 下面这个亲测有用 xff0c 特此记录一下 xff0c 我的系统版本是3 10 0 693 el7 x86 64 步骤 1 使用
  • Python选择网卡发包及接收数据包

    当一台计算机上有多个网卡时 xff0c 需要选择对应IP地址的网卡进行发送数据包或者接受数据包 1 选择网卡发包 xff08 应用scapy xff09 xff1a plface 61 conf route route 34 34 0 为对
  • php 使用 Excel/reader.php, 导入excel到数据库 ,解决The file is not readable。。

    今天小伙伴上传excel到服务器 并导入到数据库中 xff0c 可是文件一直出现 The file is not readable 是哪里的代码抛出的异常呢 xff1f 是Spreadsheet Excel Reader类里面 其中抛出异常
  • “The Language Support for Java server crashed“ 问题解决方案

    The Language Support for Java server crashed 问题解决方案 环境 xff1a Windowsvs code 1 356 14日最新发布的VSCodeJavaInstaller online win
  • (循环读取网易云缓存文件转mp3)

    循环读取网易云缓存文件转mp3 import java io DataInputStream import java io DataOutputStream import java io File import java io FileIn
  • 洛谷P4180 [BJWC2010]严格次小生成树

    传送门 之前写过一次 xff0c 但是理解不深刻 xff0c 复习之后有了更加细节的一些理解 好了进入正题 首先 xff0c 我们需要知道次小生成树一定是在最小生成树的邻集中 xff0c 即次小生成树与最小生成树只会有一条边的差别 所以我们
  • MarkDown学习笔记

    MarkDown学习笔记 目录 MarkDown学习笔记 1 标题2 段落3 文字3 1斜体3 2加粗3 3斜体 43 加粗3 4删除线3 5下划线3 6字体背景 4 分隔线5 扩展语法的说明6 高亮 xff08 需要勾选扩展语法 xff0
  • 格式化标准输出函数printf()与格式化标准输入函数scanf()

    printf 函数与scanf 函数 文章目录 printf 函数与scanf 函数格式化标准输出函数 printf 相关函数 xff1a 返回值参数执行顺序打印较长字符串格式控制符 xff1a 输出缓冲区printf 的标志转义字符类型修
  • 数据在内存中的存储

    数据在内存中的存储 文章目录 数据在内存中的存储计算机中的数据数据类型类型的基本归类整型在内存中的存储原码 反码 补码大小端介绍浮点型在内存中的存储二进制与十进制的转换 计算机要处理的信息是多种多样的 xff0c 如数字 文字 符号 图形
  • 特殊函数--变参函数及相关宏

    特殊函数 变参函数 定义的函数在使用时传入的参数是不定量不定类型 变参函数 include lt stdarg h gt 例子 xff1a printf 34 abc d def c g n 34 num ch xff09 其中 34 ab
  • 进程的内存分布

    Linux 内存分布 C进程的内存布局 Linux和windows都是支持多任务多用户的高级操作系统 进程 xff08 process xff09 xff1a 一段程序的执行过程 对于一个C程序 xff0c 在运行过程中系统对这个进程的内存
  • C语言实现24点游戏算法

    纸牌游戏24点 xff0c 输入4个1到13之间的值 xff0c 通过加减乘除判断是否可以得到24 span class token macro property span class token directive hash span s
  • C语言实现排序与组合

    span class token macro property span class token directive hash span span class token directive keyword include span spa
  • java.net.SocketException: recvfrom failed: ECONNRESET (Connection reset by peer)

    有一天我的androidHttpURLConnection 报这种错 你看 to reduce latency this class may reuse the same underlying Socket for 懂了吧 xff0c 我们
  • C语言解决四人/多人过桥问题

    参加笔试的时候遇到一道经典的算法题 xff0c 四人过桥问题 当时没写出来 x1f605 四人过桥问题 xff1a 在一个黑夜里 xff0c 有四个人需要过桥 xff0c 每次只能通过两人 xff0c 其中一人必须拿着手电筒 xff1b 但
  • C语言计算某一天是星期几

    span class token comment 1970年1月1日星期四 span span class token macro property span class token directive hash span span cla
  • 七牛云存储,上传一直超时

    今天在使用七牛云存储上传的时候 xff0c 遇到一个奇葩的问题 xff0c 就是一直上传超时 但是直接连接up qiniu com又是能够连接到的 而且iOS的有问题 xff0c android的没有问题 关于七牛云存储 xff1a htt

随机推荐

  • OSI七层网络参考模型详解

    1 什么是 OSI 模型 OSI 描述了计算机系统之间进行网络通信的模型 它是第一个网络通信标准模型 xff0c 在 1980 年代初期被所有主要计算机和电信公司采用 现代 Internet 不是基于 OSI xff0c 而是基于更简单的
  • Python制作简易OCR文字识别系统

    前不久看了一篇 如何使用Python检测和识别车牌 xff1f 用OpenCV对输入图像进行预处理 xff0c 用imutils将原始输入图像裁剪成所需的大小 xff0c 用pytesseract将提取车牌字符转换成字符串 车牌识别 但经实
  • PageHelper和Mybatis-plus分页的使用

    PageHelper和Mybatis plus分页的使用 一 PageHelper 准备sql span class token keyword CREATE span span class token keyword TABLE span
  • [RTC]系统时间NTP和RTC同步,Debian的时区配置

    转自 xff1a linux修改系统时间和linux查看时区 修改时区的方法 jiu 博客园 Debian的时区配置 一 修改时区 1 查看当前时区 命令 xff1a 34 date R 34 2 修改设置Linux服务器时区 方法 A 命
  • Autonomous Driving in Adverse Weather Conditions: A Survey - 恶劣天气条件下的自动驾驶:一项调查 (arXiv 2021)

    Autonomous Driving in Adverse Weather Conditions A Survey 恶劣天气条件下的自动驾驶 xff1a 一项调查 xff08 arXiv 2021 xff09 摘要1 引言2 自动驾驶汽车概
  • C#关于枚举类型Enum的用法详解,很细

    一 关键字enum的定义 enum是C语言中的一个关键字 xff0c enum叫枚举数据类型 xff0c 枚举数据类型描述的是一组整型值的集合 xff08 这句话其实不太妥当 xff09 xff0c 枚举型是预处理指令 define的替代
  • boost b2/bjam 参数说明

    b2 bjam 参数说明 xff1a b2 命令的功能强大 xff0c 用起来也比较复杂 xff0c 因此在使用之前 xff0c 最好先查看一下该命令的帮助 xff1a b2 exe help 以下是一些比较重要的参数说明 xff1a st
  • libssl-dev 安装失败 解决方案

    我本来是要安ettercap dependencs的 xff0c 没看到ettercap下面直接有可以使用的命令 xff0c 我上次看到了 xff0c 也提醒了自己 xff0c 但是这次我多花了5个小时搞定它 xff0c 包括了 ubunt
  • 离线文档浏览工具Zeal的下载和使用

    什么是Zeal xff1f Zeal是一款为软件开发人员提供的离线文档浏览器 截至2022年1月17日 xff0c Zeal可以下载查看207种编程语言或软件工具的帮助文档 Zeal Offline Documentation Browse
  • VS 之error MSB8020: The builds tools for v110_xp......

    VS错误如下 error MSB8020 The builds tools for v110 xp Platform Toolset 61 v110 xp cannot be found To build using the v110 xp
  • Ubuntu/Debian快速重装

    Linux系统更新升级非常快 xff0c 半年甚至几个月就会有新的版本出来 xff0c 虽然向Ubuntu能够自动升级到新的版本 xff0c 但是 xff0c 有时候升级可能效果不太好 xff0c 可能还是愿意选择重装 现在的Linux系统
  • Windows系统下QT+OpenCasCAD仿真开发

    背景 最近开发了一个六自由度机械臂调姿平台的控制软件 xff0c 集成了API激光跟踪仪和KUKA机器人 xff0c 实现了根据产品的测量位姿驱动仿真环境中模型并且实现模型间的碰撞检测 其中KUKA机器人的控制可以参考笔者以前的博客 xff
  • 通达信台阶而上成仙得道主图指标公式 副图 源码

    使用说明 上有压力线 下有支撑线 只要股价突破黄线 还有一波 效果图 直接复制以下源代码 在公式管理器中新建指标公式 复制进去就可以用了 仅供参考 KKK SMA H 11 1 N 3 CX IF KKK gt REF KKK 1 KKK
  • 有坐标的主买量占比主卖占比判断操盘通达信指标公式源码 附效果图

    使用说明 xff1a 适用通达信软件使用 xff0c 不同的软件使用要修改 直接复制以下源代码 xff0c 在公用管理器中新构建指标公用 xff0c 复制进去就可以用了 xff08 仅供参考 xff0c 下面有效果图 xff0c 可以先看看
  • 上年龄的笔记本升级固态硬盘和内存经验谈

    我的笔记本是15年买的Acer E5 422G系列 xff0c 当时花了3198元 xff0c 可以根据价格就知道 xff0c 配置不是很高 宏碁 xff08 acer xff09 E5 422G 41EF 14 英寸笔记本电脑 xff08
  • [技术讨论]keil常见问题报错及解决办法

    进行嵌入式开发过程中 xff0c keil是常用的一个工具 xff0c 但是在使用过程中经常会出现一些奇奇怪怪的问题 xff0c 其实很多问题都不难 xff0c 遇到过一次 xff0c 下次再遇到就知道怎么解决了 xff0c 我在这儿将我遇
  • PVE安装openwrt后,pve无法联网

    在pve中安装openwrt后 xff0c 有可能会出现pve系统无法连接外网的问题 有可能出现以下两种错误 xff1a 1 Temporary failure in name resolution 直接报dns的错误 2 failed N
  • Windows11/10 使用RDP远程桌面时提示 您的凭据不工作/登录没有成功可能的一种原因

    目录 看本文之前请先看问题背景解决 看本文之前请先看 微软官方的关于有关远程桌面客户端的常见问题 问题背景 Windows新装系统时就已经设置了Windows Hello 而登录系统时一直使用Windows Hello 未使用过密码进行登录
  • svn 查看检出记录

    http tortoisesvn net docs release TortoiseSVN zh CN tsvn repository hooks html 估计写一个服务器端的钩子脚本就能搞定 xff0c 你可以查阅相关的资料写一下 xf
  • C语言字符串——关于指针

    c字符串 我们知道在关于字符串的操作函数很多都包含在头文件 include lt string h gt 中 xff0c 例如计算字符串长度的函数strlen 今天我们们用自己的语言来实现一下关于字符串的复制 xff0c 连接 xff0c