字符串的总结(atoi和itoa函数的实现)

2023-11-04

目录:

一、常见的字符串函数(strlen,strcpy,strcat,strcmp)

二、关于atoi函数的实现

三、关于itoa函数的实现

一、常见字符串的函数 (strlen,strcpy,strcat,strcmp)

1.strlen:求字符串的长度,首先进行代码原理的实现:

int  arr_strlen(char *arr) {
	int count = 0;
	for (int i = 0; arr[i] != '\0'; i++) {
		count++;
	}
	return count;
}
int main() {
	char arr[20] = "abcde";
	int res= arr_strlen(arr);
	printf("%d", res);
}

运行结果: 

5
D:\c程序\p1-8\Debug\p1-8.exe (进程 17988)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

2.strcpy:字符串的拷贝,首先进行代码原理的实现:

void  arr_strcpy(char *arr,char *brr) {
	char* p = arr;
	char* q = brr;
	for (int i = 0; arr[i] != '\0'; i++) {
		*p = *q;
		p++;
		q++;
	}
}
int main() {
	char arr[20] = "abcde";
	char brr[] = "efghi";
	arr_strcpy(arr, brr);
	for (int i = 0; arr[i] != '\0'; i++) {
		printf("%c", arr[i]);
	}
}

运行结果:

efghi
D:\c程序\p1-8\Debug\p1-8.exe (进程 17696)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

3.strcat:字符串的链接,首先进行代码原理的实现:

void arr_strcat(char *arr,char* brr) {
	char* p = arr;
	char* q = brr;
	for (int i = 0; arr[i] != '\0'; i++) {
		p++;
	}
	for (int j = 0; brr[j] != '\0'; j++) {
		*p = *q;
		p++;
		q++;
	}
}
int main() {
	char arr[20] = "abcde";
	char brr[] = "efgji";
	arr_strcat(arr, brr);
	for (int  i = 0; arr[i] != '\0'; i++) {
		printf("%c", arr[i]);
	}
}

运行结果:

abcdeefgji
D:\c程序\p1-8\Debug\p1-8.exe (进程 15664)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

4.strcmp:字符串的比较,原理是通过ASCII表比较,首先进行代码原理的实现:

int  arr_strcmp(char *arr,char *brr) {  //利用ascii码表比较字符串每个字母的大小
	char* p = arr;
	char* q = brr;
	int res = 0;
	while (*p != '\0' || *q != '\0') {
		if (*p > *q) {        //如果数组arr中第一个字大于brr中第一的字母,返回1,正数
			res=1;
			break;            //循环直接退出
		}
		else if (*p < *q) {   //如果数组arr中第一个字小于brr中第一的字母,返回-1,负数
			res= -1;
			break;             //循环直接退出
		}
		else {                //如果数组arr中第一个字等于brr中第一的字母,返回0
			res= 0;
		}
		p++;                  //循环继续,指针继续遍历后面的字母,直到比较出大小
		q++;
	}
	return res;
}
int main() {
	char arr[20] = "abcde";
	char brr[] = "abghi";
	int result=arr_strcmp(arr, brr);
	printf("%d", result);
}

 运行结果:

-1
D:\c程序\p1-8\Debug\p1-8.exe (进程 8516)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

 总结:上面都是对我们常见的字符串函数原理的总结,但在平时我们想要使用字符串函数,直接引用头文件:#include<string.h>

1.strlen(arr):调用库函数,参数arr代表的是:是求'\0'前面的字符长度。

2.strcpy(arr,brr):调用库函数,参数arr,brr代表的是:将brr字符串数组中的字符拷贝给arr数组,覆盖了arr原来的字符。

3.strcat(arr,brr):调用库函数,参数arr,brr代表的是:将brr字符串数组中的字符链接在arr字符串数组中字符的后面

4.strcmp(arr,brr):调用库函数,参数arr,brr代表的是:比较arr与brr中字符的ascii码值,如果arr>brr,则返回正数(一般情况下返回1),如果arr<brr,则返回负数(一般情况下返回-1),

如果arr=brr,则返回0.

二、关于atoi函数的实现

atoi:意思是将字符串的形式转换为数字的形式,例如:将字符串"123"转换为数字123.有以下几点需要注意:

1.当字符串前面是空格的时候,转化为数字的时候要把空格删掉,例如:"     123"转化为数字123

2.当字符串前面是+-号时,转化为数字要根据数学上的算法将正负号保留,例如:"+-+-+--123"转化为数字为-123

3.当字符串前面为字母时候,直接不进行转换,例如:"abcd123",程序直接退出

4.当字符串后面为字母时,后面的字母全部不要,例如:"123abc"转换为数字为123

接下来我们进行代码的实现,首先我们用库函数看一下这个结果 

#include<stdlib.h>   //记住使用atoi函数时引用头文件
int main() {
	const char* arr = "123";
	const char* brr = "    123";
	const char* crr = "-123";
	printf("%d %d %d", atoi(arr), atoi(brr), atoi(crr));
}

运行结果:

123 123 -123
D:\c程序\p1-8\Debug\p1-8.exe (进程 18296)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

接下来,我们对这个函数的原理进行代码的实现:

#include<ctype.h>    //关于引用库函数isdigit所使用的头文件
#include<math.h>    
int  atoi_array(const char* arr) {  //统计字符串中数字的个数
	const char* p = arr;
	int count = 0;
	while (*p != '\0') {     
		if (*p == ' ') {           //跳过空格
			p++;
			continue;
		}
		else if (*p == '+' || *p == '-') {      //跳过符号
			p++;
			continue;
		}
		else if (isdigit(*p)) {
			count++;            //用count计数从而统计个数
			p++;
		}
		else {
			break;
		}
	}
	return count;
}
int  reserve(const char* arr) {  //将字符串中的数字转化为数字
	const char* p = arr;
	int flag = 1;              //标记负号,如果不用标记,也可以用判断奇偶
	int res = 0;
	int bit = atoi_array(arr);
	while (*p != '\0') {
		if (isblank(*p)|| *p == '+') {
			p++;
		}
		else if (*p=='-') {   //如果为负号就乘以-1
			flag = (-1) * flag;
			p++;
		}
		if (isdigit(*p)) {    //如果为数字字符就转化为数字
			res += (*p - '0')*(int)pow(10, --bit);
			p++;
		}
	}
	return res*flag;
}
int main() {
	const char* arr = "    -123";
	int result=reserve(arr);
	printf("%d", result);
}

运行结果:

-123
D:\c程序\p1-8\Debug\p1-8.exe (进程 19408)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

 三、关于itoa函数的实现

itoa:意思是将整形数字以进制的形式转化为字符串,但是itoa原理的实现错综复杂,例如:

1.将数字123转化为10进制下的字符串,则为"123"

2.将数字100转化为8进制下的字符串,则为"144"

3.将数字16转化为16进制下的字符串,则为"a"

4.将数字-1转化为2进制下的字符串,则为"1111111111111111",16个1

我们如果想要实现以上功能该如何实现呢,首先我们将一些知识点罗列出来:

1.首先我们将最常见的数字以进制的形式转化为字符串,不管是十进制,八进制,我们根据进制转化的原理知道:当一个数转化为进制的时候要用辗转相除法,不断地除以它的进制数,然后倒着读就可以了

2.当遇到转化为16进制涉及abcd等字母的时候,我们怎么办,这是我们想到只需要把26个字母罗列出列,然后对应下表去存放数字就可以了

3.当遇到负数,我们又该怎么办,(我们都知道负数是以补码的形式保存在计算机里面)此时我们想到无符号处理负数,简单的以-1举例:我们知道当有符号的时候,用char类型保存-1,它的数值范围是-128~127,而转化为无符号类型的时候,它的数值范围就变成了0~256(此时负数辗转相除的结果就位11111111),此时的符号位也要变成数值位,符号位便消失了,不存在正负的情况,所以当我们将有符号类型强转为无符号类型,负数情况自然而然就解决了。

接下来我们进行代码的实现,首先我们用库函数看一下这个结果 

int main() {
	int a = -1;
	char arr[100];
	_itoa_s(a, arr, 2);  //在vs中为了安全性函数引用的库函数变为_itoa_s
	for (int i = 0; arr[i]!='\0'; i++) {
		printf("%c", arr[i]);
	}

运行结果:

11111111111111111111111111111111
D:\c程序\p1-8\Debug\p1-8.exe (进程 17308)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

接下来,我们对这个函数的原理进行代码的实现:

char* itoa_arr(int value,char* buff, int redex) {
	assert(buff != NULL);
	int index = 0;
	int res = 0;
	int flag = 0;//标记负号
	char arr[100] = "0123456789abcdefghijklmnopqrstuvwxyz";//arr下标对应res,目的将字符取出
        if (value < 0 && redex == 10) {   //如果为10进制,将符号单独存放起来
			buff[index++] = '-';
			value *= -1;  //此时value变为正数
			flag = 1;
		}
		unsigned int u_value = (unsigned int)value;  //将value进行无符号化
		while (u_value != 0) {  //辗转相除法
			res = u_value % redex;
			buff[index++] = arr[res];
			u_value /= redex;
		}
	
	//实现数组的逆转
	for (int i = 0; i < (index + 1) / 2; i++) {
		char temp = buff[i+flag];
		buff[i+flag] = buff[index-1];
		buff[index-1] = temp;
		index--;
	}
	return buff;
}

int main() {
	char buff[100] = {0};
	itoa_arr(-100, buff, 10);  //测试代码
	for (int i = 0; buff[i] !='\0'; i++) {
		printf("%c", buff[i]);
	}
}

结果一如下:

-100
D:\c程序\p1-8\Debug\p1-8.exe (进程 14780)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

将测试代码修改为itoa_arr(-1, buff, 2);结果如下:

11111111111111111111111111111111
D:\c程序\p1-8\Debug\p1-8.exe (进程 5260)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

字符串的总结(atoi和itoa函数的实现) 的相关文章

  • 未来五年NFV增长率将达55%

    市场研究机构ABI Research发布的最新数据显示 2017年 2022年期间 网络功能虚拟化软件市场增长率将达到55 同时网络功能虚拟化服务将增长50 同期的硬件支出将下降 在欧洲 整个市场预测期内的年均复合增长率将达到53 但北美地
  • 【git】Github 上的 markdown 文件怎么上传并显示图片?

    要在GitHub上的Markdown文件中上传图片 可以使用以下步骤 一 上传图像文件夹 将图片上传到GitHub仓库中 你可以在仓库中创建一个文件夹 专门用于存储图片 二 在Markdown文件中插入图片 在Markdown文件中插入图片
  • win mac 双系统 opencore 硬盘引导_奶白MacOS+WIN 10双系统主机安装记录

    暑假地时候就计划要组装一台MacOS WIN 10双系统纯白主机 折腾了三个月 终于完美完成了主机的安装 配置单 处理器 Intel i7 10700K 主板 七彩虹CVN Z490 GAMING FROZEN V20 显卡 影驰 RTX2
  • VMware虚拟机的配置与Linux的安装

    VMware虚拟机的配置与Linux的安装 在这里使用的是VMware15版本和CentOS 7 x86 64 Minimal VMware虚拟机压缩包以及CentOS 7 x86 64 Minimal需要的点击下载 下面我们进行VMwar

随机推荐

  • tomcat配置通过域名访问,并且不加端口和项目名称

    废话不多说 直接上代码 首先tomcat的路径 打开server xml并在
  • 前端课设 网页设计期末作业-静态网页(下载链接在文末)

    网页设计期末作业 网站详情如下图所示 点我下载 https mp csdn net mp download manage download UpDetailed
  • ch4_7 确认字符串中的重复子串

    leetcod 459 重复的子字符串 给定一个非空的字符串 s 检查是否可以通过由它的一个子串重复多次构成 示例 1 输入 s abab 输出 true 解释 可由子串 ab 重复两次构成 1 关键点分析 使用KMP 中构造出 最大相同前
  • 数据分析利器Jupyter notebook入门手册

    公众号 尤而小屋作者 Peter编辑 Peter 大家好 我是Peter 很多读者问过我 Peter文章中的Python代码都是用的什么编辑器写的 今天就公开啦 Jupyter Notebook 没有Pycharm 没有Vscode 没有S
  • python粘性扩展_1. 使用 C 或 C++ 扩展 Python

    1 12 给扩展模块提供C API 很多扩展模块提供了新的函数和类型供Python使用 但有时扩展模块里的代码也可以被其他扩展模块使用 例如 一个扩展模块可以实现一个类型 collection 看起来是没有顺序的 就像是Python列表类型
  • Linux国际化设置locales

    更新国际话文件时 yan yan laptop var lib locales supported d sudo locale gen Generating locales en AG UTF 8 done en AU UTF 8 done
  • jQuery的筛选器

    jQuery的筛选器 用在jQuery选择的元素集合的后面 都是方法 为了对已经选择出来的元素进行二次筛选 筛选器 1 first gt 筛选集合里面的第一个元素 2 last gt 筛选集合里面的最后一个元素 3 eq n gt 筛选集合
  • openGL之API学习(五十六)低模、高模的区别以及各自的使用领域

    高模是高细节高精度的3D模型 高模看上去十分逼真细节非常丰富模型的面数也相当的高 低模是游戏里的说法 可以理解为游戏所使用的模型 高模有很多作用可以用于电影制作 广告等等 在游戏里高模主要是为了烘焙NormalMap 并且运用在游戏低模型上
  • Antd a-tree 树形控件,选中的节点高亮。

    实现最简单的树展示列表 效果图 template中
  • javaWeb

    1 基本概念 Web开发 静态网页 提供给所有人看的数据始终不会发生变化 动态网页 提供给所有人看的数据始终会发生变化 每个人在不同的时间 不同的地点看到的信息各不相同 在java中 动态Web资源开发的技术统称为javaWeb web应用
  • 脑电信号EEG分类基础入门(1)机器学习编程环境搭建

    网上大多数资料都是基于python语言的 我的编程环境和工程都是python 但也会用matlab来可视化理解 用到的安装包和代码资料已经整理好了 https download csdn net download fzf1996 21484
  • Linux学习笔记:用fdisk工具分区,swap分区的管理

    1 什么是MBR 什么是分割表 MBR master boot record 即硬盘的主引导记录 分割表 partition table 即硬盘的分区表 在系统关机时 硬盘内的磁盘上的磁头会回到整个磁盘的第一个扇区 当再次启动系统时 磁头会
  • ccwow服务器维护,牧师 - 军团再临 - 178魔兽世界

    牧师职业大厅 军团再临资料片中最大的改动便是神器和职业大厅了 如同德拉诺版本的要塞系统一样 7 0的职业大厅便像是一个强化版的要塞 不过在这里你不再是一个人 相同职业的玩家都会和你在一起来共同探索破碎群岛对抗燃烧军团 那让我们走进虚空之光神
  • calico固定podip

    实现方法 利用calico组件的两个kubernetes注解 1 gt cni projectcalico org ipAddrs 2 gt cni projectcalico org ipv4pools 场景1 单个pod固定ip 利用c
  • HttpClient release connection 该放手的时候必须放手

    Apache commons 系列的HttpClient 相信大家都用过 选择它而非JDK 的java net HttpURLConnection 是为了使用HttpClient 封装的几个实用的功能 目前使用最多的版本还是httpclie
  • 腾讯云2022年双11云服务器配置及报价表汇总

    活动直达 点此进入腾讯云2022年双11活动主会场 腾讯云2022年双11活动的既有轻量应用服务器又有云服务器 购买资格分为个人企业同享和企业用户专享 因此 价格表可分为个人企业同享轻量应用服务器 个人企业同享云服务器 企业专享轻量应用服务
  • 618来袭!我用Python脚本实现了淘宝定时自动秒杀,小白也能轻松搞定!

    准备工作 我们需要把秒杀的商品加入购物车 因为脚本点击的是全选 所以不需要的商品要移出购物车 展示篇幅有限 淘宝秒杀程序的完整源代码已经打包好了 需要的朋友可以扫码加v 我分享给你 过程分析 1 打开某宝网站 pq webdriver Ch
  • 基于Fisco的测压工具使用笔记

    基本过程就是这样了 因为当初写的时候是用OneNote写的 复制过来是图片形式 然后主要的坑就是官方的源码有错误 官方也给了修改意见 根据 修改意见 修改源码 修改完我还碰到一个坑 不知道为什么这个位置缺少文件 移动到这个文件下添加solc
  • 【LeetCode】Day211-不用加减乘除做加法

    题目 剑指 Offer 65 不用加减乘除做加法 中等 题解 不能用加减乘除的题 要考虑位运算 设两数字的二进制形式a b s a b a i 代表a的二进制的第i位 则分为以下四种情况 a i b i 无进位和n i 进位c i 1 0
  • 字符串的总结(atoi和itoa函数的实现)

    目录 一 常见的字符串函数 strlen strcpy strcat strcmp 二 关于atoi函数的实现 三 关于itoa函数的实现 一 常见字符串的函数 strlen strcpy strcat strcmp 1 strlen 求字