C++ char* 字符串处理、数组指针及传参

2023-05-16

编写函数,将一个字符串 str 中指定的字符 ch 删去(包括重复出现的字符),并编写主函 数进行调用测试。

函数原型: void delchar(char *str,char ch);。

输入: 占二行。

第 1 行,输入任意字符串(注:输入的字符串长度不会超过 80)

第 2 行,输入一个字符

输出: 占一行

样例输入: x=-3,456,789; y=1,113,458 ,

样例输出: x=-3456789; y=113458

 

代码

# include<iostream>
# include<cstring>
# include<string> 
# include<fstream>
using namespace std;

void delchar(char *str, char ch){
	int n=0;
	int i;
	for(i=0; str[i]!='\0'; i++){
		if(str[i]==ch){
			n++;
			continue;
		}
		str[i-n]=str[i];
	}
	str[i-n]='\0';
}

int main(){
	char * str = new char[100];
	cin.getline(str, 100);    
	// cin >> str;
	char v;
	cin >> v;
	delchar(str, v);
	// str += 5;
	cout << str;
}

数组指针

在使用 char* name定义字符串时,应加上长度限制,如char*str=new char[80];

其中name指向第一个元素的地址,所以如下*a可以输出首元素,而*(a+6)可以输出第七个元素,未定义时为0,当然,上面程序中的str也是一个数组,所以我们可以用str[n]进行处理

同样在字符串char*中,如果想删掉前面的几个字符,只需要 name+=n;即可,即将首指针向后移几位

# include<iostream>
using namespace std;

int main(){
	int a[10]={5, 7, 4, 6};
	cout << *a << endl;
	cout << *(a+6) << endl;
	a[6] = 100;
	cout << *(a+6) << endl;
}

/*
5
0
100
*/

指针传参

当我想将字符串前面截掉一部分,我可以令str+=5,这个式子写在函数内与函数外有什么区别呢?

运行如下代码可以看出,我们在函数内部改变了str的指向,并可以输出截取后的部分,但在函数外再次输出时,却没有变化

因为:通常情况下,c++是传值调用,它是单向的,只能从实参到形参。形参实质上市实参的一种拷贝,所以传递时不会改变外部实参的值

所以str指向的位置只能在本层及以下发生改变

# include<iostream>
# include<cstring>
# include<string> 
# include<fstream>
using namespace std;

void delchar(char *str, char ch){
	int n=0;
	int i;
	for(i=0; str[i]!='\0'; i++){
		if(str[i]==ch){
			n++;
			continue;
		}
		str[i-n]=str[i];
	}
	str[i-n]='\0';
	cout << str << endl;
	str += 5;
	cout << str << endl;
}

int main(){
	char * str = new char[100];
	cin.getline(str, 100);   
	// cin >> str;
	char v;
	cin >> v;
	cout << str << endl;
	str += 5;
	cout << str;
}

/*
x=-3456789; y=1113458
56789; y=1113458
x=-3456789; y=1113458
56789; y=1113458
*/

当我们确实想在函数内实现截取,只能曲线救国,不改变str,而费尽的改变这一串字符串的值,比如使用Memcpy函数

比如改为如下,就是建立一个new_s,将目标串写入new_s,再赋给str的相应位置

memcpy函数,将第二个参数的数组赋给第一个参数的位置,第三个参数为赋值的字节数(字符串结尾为'\0',所以+1)

void delchar(char *str, char ch){
	int n=0;
	int i;
	for(i=0; str[i]!='\0'; i++){
		if(str[i]==ch){
			n++;
			continue;
		}
		str[i-n]=str[i];
	}
	str[i-n]='\0';
//	cout << str << endl;
//	str += 5;
//	cout << str << endl;
	char * new_s = new char[100];
	int k=0;
	int j;
	for(j=5; str[j]!='\0'; j++){
		new_s[k++] = str[j];
	}
	cout << new_s << endl; 
	memcpy(str, new_s, strlen(new_s)+1);
}

字符串的输入和遍历

字符串输入有几种方式:

getline属于string流,需包含string头文件

cin.getline属于cin流,所以不能用于string类型

而cin遇到空格即结束

代码如下(用了文件读,filen相当于cin):

	ifstream file1("vals.txt");
	string s;
	getline(file1, s);
	cout << s << endl;
	
	ifstream file2("vals.txt");
	char* s2 = new char[100];
	file2.getline(s2, 100);
	cout << s2 << endl;
	
	ifstream file3("vals.txt");
	char* s3 = new char[100];
	file3 >> s3;
	cout << s3 << endl;
	
	int len=0;
	for(; s2[len]!='\0'; len++){
	}
	cout << len << " " << strlen(s2) << " " << sizeof(s2) << " " << s.size() << endl;

/*
5 6 9 10 7 -1
5 6 9 10 7 -1
5
13 13 8 13
*/

对于字符串长度的计算,可以用strlen()来计算,但要引用头文件 cstring

也可根据'\0'为最后一个的性质计算

string类型可以采用s.size()函数

但要注意 sizeof返回括号内类型的长度(即指针类型的长度两字节)

 

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

C++ char* 字符串处理、数组指针及传参 的相关文章

  • 生成aruco码方法

    有两种方法得到想要的aruco码 xff1a 1 直接通过网址得到 http chev me arucogen xff08 不过只有四个格式 xff09 网页截图为 xff1a 2 通过运行C 43 43 代码得到 利用C 43 43 生成
  • 超详细c语言简化tcp通信接口(多线程实现一个服务端处理多个客户端服务)

    超详细c语言tcp通信接口 1 可下载源码 xff08 客户端 服务端通信 xff09 2 说明3 接口代码4 客户端通信main client demo c5 服务端通信main server demo c 1 可下载源码 xff08 客
  • 怎么在视频上叠加字幕和Logo--技术实现1

    这篇文章我给大家讲解的这种字幕叠加和Logo叠加方法是在渲染视频的时候 画 上去的 xff0c 其实是通过某种API将OSD和Logo绘制到显卡缓存 xff0c 然后提交缓存到屏幕 我们知道渲染视频有几种常用的API xff1a GDI x
  • opencv源码编译及配置完整版教程(win10+vs2019+opencv-4.4.0+opencv_contrib-4.4.0)

    opencv源码编译及配置完整版教程 xff08 win10 43 vs2019 43 opencv 4 4 0 43 opencv contrib 4 4 0 xff09 一 下载vs2019 官网下载 xff1a https visua
  • c++使用多个库的头文件内容里有名字相同问题

    首先说下结构体 xff0c 如果两个头文件定义的结构体内容不一样 xff0c 但名字一样 xff0c 当一个文件同时包含着两个头文件的时候 xff0c 就会报如下错误 xff1a 此时 xff0c 在不修改头文件的情况下 最好不要改动 xf
  • 蓝牙模块 HC08_两个STM32开发板无线通信

    一 HC08重要参数 蓝牙4 0 xff0c BLE xff0c 主从一体 xff1b 模块上电后 xff0c 启动需要150ms xff1b UART波特率 xff1a 9600默认 xff1b 空中速率 xff1a 1Mbps 与HC0
  • STM32 --- 使用内部FLASH存储数据

    本文记录了对一些知识点的理解 操作方法 xff0c 如有错误 xff0c 请务必批评指正 xff01 xff01 最终的测试截图 xff1a 目录 一 内部FLASH要点 关于地址 xff1a 关于解锁 xff1a 关于擦除 xff1a 关
  • Keil 代码自动格式化对齐整理 AStyle设置图解

    代码对齐 xff0c 使用前后效果 xff1a 建议 设置成快捷键 xff1a CTRL 43 S xff0c 即可保存 43 对齐 一 下载插件 https sourceforge net projects astyle files as
  • keil5 烧录程序到单片机的方法

    Keil是一种常用的单片机开发工具 xff0c 支持多种单片机芯片 下面详细说明Keil5如何烧录程序到单片机的方法 编译程序 首先 xff0c 在Keil5中打开编写好的程序工程 xff0c 进行编译 编译生成的可执行文件是 hex或 b
  • 基于STM32 + SYN6288语音播报

    完整代码下载 https download csdn net download zhouml msn 85592868 一 接线示例 xff1a 二 模块重点 xff1a 1 xff1a 5V供电 xff0c 功耗约120mA 带图中小喇叭
  • STM32开发---ADC单通道电压采集

    代码zip下载 xff1a https download csdn net download zhouml msn 86666457 spm 61 1001 2014 3001 5501 STM32 ADC单通道电压数据采集 xff0c 直
  • Keil仿真调试Debug不能放断点_图解

    前提 xff1a 正常连接了调试器 43 开发板 xff0c 才能进入Debug模式 xff01 xff01 xff01 一 正常情况 当Keil进入Debug模式 xff0c 正常可以放置断点时的界面 xff0c 是下面这样的 xff1a
  • 无人机(2)_电机

    型号值 如2212 前两位 电机外径 后两位 转子高度KV值 电机空转 时 电压每提高1V 电机转速提高 800转 分钟无刷电机 电机分有刷和无刷 无人机都是无刷 电机 贵 力气大 耐用 电池节数 很重要 一节是4 2V电调大小 A越大越好
  • Linux下运用opencv的简单图像编程

    文章目录 Linux下运用opencv的简单图像编程一 编写一个打开图片进行特效显示的代码 一 用普通方式编译程序1 准备工作 xff1a 2 准备一张图片 xff0c 移到相同目录下3 编译程序4 运行程序 二 用make 43 make
  • 简单stm32程序编写以及调试

    简单stm32程序编写以及调试 一 环境配置 1 MDK的安装 MDK xff08 Microcontroller Development Kit xff09 是针对ARM处理器 xff0c 特别是Cortex M内核处理器的最佳开发工具
  • STM32以中断的方式点亮LED小灯(标准库)

    STM32以中断的方式点亮LED小灯 xff08 标准库 xff09 文章目录 STM32以中断的方式点亮LED小灯 xff08 标准库 xff09 一 认识中断1 中断优先级 xff1a 2 中断嵌套 xff1a 3 中断执行流程4 中断
  • STM32 I2C_OLED显示汉字及屏幕滚动

    STM32 I2C OLED显示汉字及屏幕滚动 文章目录 STM32 I2C OLED显示汉字及屏幕滚动一 I2C以及AHT20温湿度传感器介绍二 用0 96寸OLED屏幕显示数据1 OLED介绍2 样例测试 三 汉字编码原理编码排序A0A
  • # FPGA编程入门

    FPGA编程入门 文章目录 FPGA编程入门一 1位全加器1 原理图1 1原理图1 2 全加器 2 verilog实现1位全加器2 1 代码2 2 编译 xff0c 查看RTL2 3 仿真实现 二 烧录三 4位全加器1 原理图实现4位全加器
  • 基于NIOS-II软核与verilog语言的流水灯实现

    基于NIOS II软核与verilog语言的流水灯实现 文章目录 基于NIOS II软核与verilog语言的流水灯实现1 实验目的2 实验设备3 实验内容4 软核设计4 1 新建一个工程4 2 Qsys 系统设计4 3 进行逻辑连接4 3
  • 处理器的大小端及位序

    大端Big Endian xff1a 数据的高字节存储到低位地址中 小端little Endian xff1a 数据的低字节存储到低位地址中 举例说明 xff1a 32位16进制数据为 61 0x12345678 xff0c 大端存储 地址

随机推荐

  • # VGA协议实践

    VGA协议实践 文章目录 VGA协议实践1 VGA介绍2 ALTPLL3 字模与图像生成4 ROM5 代码5 1 vga驱动模块5 2 显示数据生成模块5 3 按键消抖模块5 4 顶层模块5 5 TCL绑定引脚代码 6 效果7 总结8 参考
  • 串口扩展芯片

    串口扩展芯片 WK2124 实现SPI桥接 扩展4个增强功能串口 xff08 UART xff09 功能 扩展的子通道具备以下功能特点 xff1a 每个子通道UART的波特率 字长 校验格式可以独立设置 xff0c 最高可以提供2Mbps的
  • 手把手教你学51单片机_第 一、二章

    MCU CPU Flash 8kByte EMMC 64G 程序存储空间 xff0c 容量大 xff0c 掉电数据不丢失 RAM 512Byte DDR 4G 代码运行时中间变量的存取区 xff0c 无限次读写 xff0c 且读写速度快 x
  • 九天揽月带你玩转Ardupilot 的EKF2纸老虎

    目录 目录 摘要 1 kalman基础知识储备 2 ardupilot代码EKF流程学习 3 下面重点 逐一分析各个函数 摘要 本文主要记录自己学习ardupilot的ekf2代码的过程 xff0c 相信很多人想移植或者学习ekf2 看到眼
  • 在C++中定义全局变量时避免重复定义

    问题 xff1a 如何在C 43 43 中定义全局变量时避免重复定义呢 今天遇到问题 xff0c 全局变量重定义错误 xff0c 印象中记得要加extern xff0c 但是怎么都不对 xff0c 找资料后得到了解决方案 xff0c 记之
  • Ubuntu16.04下的FireFox浏览器无法查看网页视频的原因及解决方法

    Ubuntu16 04自带的firefox浏览器 在搭建好其他环境后 xff0c 我通过firefox去廖雪峰老师的官网查看python的教程 xff0c 发现无法打开网页中的视频 此时 xff0c 我又通过firefox浏览器中进入了腾讯
  • 【嵌入式模块】MPU6050

    文章目录 0 前言1 MPU6050概述1 1 基本概述1 2 引脚和常用原理图 2 代码3 姿态解算3 1 欧拉角 amp 旋转矩阵3 2 DMP 3 校正 0 前言 作为惯性传感器中入门级别的器件 xff0c MPU6050凭借它出色的
  • 7-13 出栈序列的合法性(25 分)(解决此类题的重要规律)

    给定一个最大容量为 M 的堆栈 xff0c 将 N 个数字按 1 2 3 N 的顺序入栈 xff0c 允许按任何顺序出栈 xff0c 则哪些数字序列是不可能得到的 xff1f 例如给定 M 61 5 N 61 7 xff0c 则我们有可能得
  • STL-map的简单用法(以及如何使用sort将map进行排序)

    map是不可排序的 xff0c 可是凡事都不是绝对的 xff0c 现在我就告诉大家如何将map进行简单的排序以及其的简单用法 一 map的常用方式 xff1a mapname clear xff09 xff1a 清空map mapname
  • 初识c语言的条件判断和循环。

    刚开始接触c语言的循环 xff0c 也许你会烦躁 xff0c 但是你只需要静下心来再看一遍 xff0c 你就会有更多的收获 xff0c 加油 xff01 xff08 凡事开头难 xff0c 迈过第一关 xff0c 你就是最棒的 xff01
  • digest鉴权

    摘要 式认证 xff08 Digest authentication xff09 是一个简单的认证机制 xff0c 最初是为HTTP协议开发的 xff0c 因而也常叫做HTTP摘要 xff0c 在RFC2671中描述 其身份验证机制很简单
  • 超长整型除法运算

    1017 A除以B 20分 本题要求计算 A B xff0c 其中 A 是不超过 1000 位的正整数 xff0c B 是 1 位正整数 你需要输出商数 Q 和余数 R xff0c 使得 A 61 B Q 43 R 成立 输入格式 xff1
  • 练习2-11 计算分段函数[2] (10分)

    本题目要求计算下列分段函数f x 的值 xff1a f2 11 注 xff1a 可在头文件中包含math h xff0c 并调用sqrt函数求平方根 xff0c 调用pow函数求幂 输入格式 输入在一行中给出实数x 输出格式 在一行中按 f
  • 习题4-2 求幂级数展开的部分和 (20分)

    已知函数e x可以展开为幂级数1 43 x 43 x 2 2 43 x 3 3 43 43 x k k 43 现给定一个实数x xff0c 要求利用此幂级数部分和求e x 的近似值 xff0c 求和一直继续到最后一项的绝对值小于0 0000
  • 练习7-10 查找指定字符 (15分)

    本题要求编写程序 xff0c 从给定字符串中查找某指定的字符 输入格式 xff1a 输入的第一行是一个待查找的字符 第二行是一个以回车结束的非空字符串 xff08 不超过80个字符 xff09 输出格式 xff1a 如果找到 xff0c 在
  • 习题9-5 通讯录排序 (20分)

    输入n个朋友的信息 xff0c 包括姓名 生日 电话号码 xff0c 本题要求编写程序 xff0c 按照年龄从大到小的顺序依次输出通讯录 题目保证所有人的生日均不相同 输入格式 输入第一行给出正整数n xff08 lt 10 xff09 随
  • C++提高运行速度

    ios base span class token punctuation span span class token punctuation span span class token function sync with stdio s
  • Java小项目(功能齐全)-停车场管理系统(中英文版)

    一 项目目的 xff1a 停车场管理系统 对停车场进行更系统的管理 xff0c 使整个过程更加高效有序 二 主要功能 xff1a 1 进入停车场 2 离开停车场 3 搜索信息 4 停车场当前车位明细查询 5 历史查询 三 附加功能 xff1
  • 应用YOLOV4 - DeepSort 实现目标跟踪

    转载自 https cloud tencent com developer article 1706259 本文分享利用yolov4 43 deepsort实现目标跟踪 xff0c 主要是讲解如何使用 xff0c 具体原理可以根据文中的参考
  • C++ char* 字符串处理、数组指针及传参

    编写函数 xff0c 将一个字符串 str 中指定的字符 ch 删去 xff08 包括重复出现的字符 xff09 xff0c 并编写主函 数进行调用测试 函数原型 void delchar char str char ch 输入 xff1a