26.【C语言】字符串转无符号整型unsignedint、字符串转有符号整型int、无符号整型unsignedint转字符串、有符号整型转字符串(5_task)
算法思想:
1. 字符串转无符号整型unsignedint
初始化一个字符串str;num用于存放当前转换的整型数,初始化为0。对字符串str中的每个字符进行判断,一旦扫描到当前字符在数字字符的范围之外,直接跳出循环。那么转换的整型数是由从串首开始,一直到不为数字字符或为结束符为止形成的一段纯数字字符。若在数字字符的范围之内,当前num为上一次转换的num乘10,再加上当前字符与字符‘0’的ASCII值的差值。其实当前字符转换成的整型数值就是当前字符的ASCII值减去‘0’的ASCII值。每一次把对应的字符转换后,字符指针str就向后偏移一个字符位置。因为是字符串转换成整型数,得到的是一个整型数值,那么该函数为返回值的int类型。
函数实现代码如下:
int unsignedstrtoint(char *str) //开头不带正负号的字符串转整型
{int num = 0;if (NULL == *str) //字符串为空return 0;else {while (str){if (*str<'0' || *str>'9') //只要当前字符不在数字字符的范围内,直接跳出循环break;elsenum = num * 10 + (*str - '0'); //括号里面的是二者字符对应ASCII值的差值,即为当前位置的字符对应的整型值str++;}}return num;
}
2. 字符串转有符号整型int
该函数的思路和字符串转无符号整型unsignedint主体相同,不同的是需要判断字符串串首是‘+’,还是数字字符,还是‘-’。前两种表示正数形式,后一种为负数形式。如果串首是‘+’或‘-’,那么字符指针就向后移1个字符位置,然后做相应处理,否则直接做相应处理。最后如果串首为‘-’,那么函数返回num的相反数。因为还是字符串转换成整型数,得到的是一个整型数值,那么该函数为返回值的int类型。
函数实现代码如下:
int strtoint(char *str) //开头不带正负号的字符串转整型
{int num = 0;short flag; //用于标记转换后整型的符号if (NULL == *str) //字符串为空return 0;else if ('-' == *str){flag = 1;str++;}else if ('+' == *str){flag = 0;str++;}elseflag = 0;while (str){if (*str<'0' || *str>'9') //只要当前字符不在数字字符的范围内,直接跳出循环break;elsenum = num * 10 + (*str - '0'); //括号里面的是二者字符对应ASCII值的差值,即为当前位置的字符对应的整型值str++;}if (flag)num = (-1)*num;return num;
}
3. 无符号整型unsignedint转字符串
整型数转字符串就和上述的做法相反。无符号整型数unsignedint的取值范围为0~65535,那么字符串就需要用大小为6的字符数组c存放。用变量num存放整型数。num%10得到当前num的个位,这个数再加上‘0’的ASCII值就得到num的个位所代表字符的ASCII值,装入字符数组c。此时num还需要减去个位数值,再除10,这样原先num的十位变成现在的个位。便于下一次重复操作。同时用变量i记录放在字符数组中的位置下标。直到num为0,整型数的每一位读取结束,此时i为字符串长度。打印字符数组c会发现整型数的每一位在数组中的顺序是倒着放的。所以还需要将字符数组逆置。逆置的实现可以用两个变量low、high,分别表示数组的第一个位置下标和最后一个位置下标,这两个下标,一个向后移,一个向前移,对应指向的元素交换位置,直到low>high为止,逆置完成。最后将数组c得到的字符串传给第二个形参。
这个函数是无返回值的void类型,得到的是数组。假设这个函数为返回字符数组的指针类型,返回值是一个指针,那么在调用该函数的位置需要定义一个字符指针s,放着这个函数内部字符数组c的起始地址。一旦这个函数执行结束,指针c的地址就会释放,那么s指向的内容为空。所以该做法不可取。
调用该函数前需要初始化一个大小为6的字符数组,然后将该数组的字符串给该函数的第二个形参s,指针s传递的是一个字符数组的起始地址。
函数实现代码如下:
void unsignedinttostr(int num,char *s) //调用该函数前事先初始化一个大小为6的字符数组,第二个形参是该数组的指针
{char c[6]; //无符号整型int的范围是0~65535,c[5]放结束符int i = 0;memset(c, 0, sizeof(c));while (num){c[i] = num % 10 + '0';num = (num - num % 10) / 10;i++;} //循环结束i=5int low = 0, high = i - 1; //c[0]~c[4]这部分的字符串逆置while (low <= high){char temp = c[low];c[low] = c[high];c[high] = temp;low++;high--;}strcpy(s, c);
}
4. 有符号整型转字符串
该函数的思路和无符号整型unsignedint转字符串主体相同,不同的是需要判断需要判断整型数num 的正负。无符号整型数unsignedint的取值范围为-32768~+32768,那么字符串就需要用大小为7的字符数组c存放,c[0]存放整型数的正负号。在将数组c逆置的时候,逆置的是c[1]-c[5]这一段字符串。其余做法和无符号整型unsignedint转字符串相同。
调用该函数前需要初始化一个大小为7的字符数组,然后将该数组的字符串给该函数的第二个形参s,指针s传递的是一个字符数组的起始地址。
函数实现代码如下:
void inttostr(int num,char *s) //该函数在使用时事先初始化一个大小为7的字符数组,第二个形参是该数组的指针
{char c[7]; //有符号整型int的范围是-32767~+32767,c[0]放符号,c[6]放结束符memset(c, 0, sizeof(c));if (num >= 0)c[0] = '+';elsec[0] = '-';int i = 1; //从c[1]开始操作num = abs(num);while (num){c[i] = num % 10 + '0';num = (num - num % 10) / 10;i++;} //循环结束i=6int low = 1, high = i - 1; //c[1]~c[5]这部分的字符串逆置while (low <= high){char temp = c[low];c[low] = c[high];c[high] = temp;low++;high--;}strcpy(s, c);
}
完整代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int unsignedstrtoint(char *str) //开头不带正负号的字符串转整型
{int num = 0;if (NULL == *str) //字符串为空return 0;else {while (str){if (*str<'0' || *str>'9') //只要当前字符不在数字字符的范围内,直接跳出循环break;elsenum = num * 10 + (*str - '0'); //括号里面的是二者字符对应ASCII值的差值,即为当前位置的字符对应的整型值str++;}}return num;
}void unsignedinttostr(int num,char *s) //调用该函数前事先初始化一个大小为6的字符数组,第二个形参是该数组的指针
{char c[6]; //无符号整型int的范围是0~65535,c[5]放结束符int i = 0;memset(c, 0, sizeof(c));while (num){c[i] = num % 10 + '0';num = (num - num % 10) / 10;i++;} //循环结束i=5int low = 0, high = i - 1; //c[0]~c[4]这部分的字符串逆置while (low <= high){char temp = c[low];c[low] = c[high];c[high] = temp;low++;high--;}strcpy(s, c);
}int strtoint(char *str) //开头不带正负号的字符串转整型
{int num = 0;short flag; //用于标记转换后整型的符号if (NULL == *str) //字符串为空return 0;else if ('-' == *str){flag = 1;str++;}else if ('+' == *str){flag = 0;str++;}elseflag = 0;while (str){if (*str<'0' || *str>'9') //只要当前字符不在数字字符的范围内,直接跳出循环break;elsenum = num * 10 + (*str - '0'); //括号里面的是二者字符对应ASCII值的差值,即为当前位置的字符对应的整型值str++;}if (flag)num = (-1)*num;return num;
}void inttostr(int num,char *s) //该函数在使用时事先初始化一个大小为7的字符数组,第二个形参是该数组的指针
{char c[7]; //有符号整型int的范围是-32767~+32767,c[0]放符号,c[6]放结束符memset(c, 0, sizeof(c));if (num >= 0)c[0] = '+';elsec[0] = '-';int i = 1; //从c[1]开始操作num = abs(num);while (num){c[i] = num % 10 + '0';num = (num - num % 10) / 10;i++;} //循环结束i=6int low = 1, high = i - 1; //c[1]~c[5]这部分的字符串逆置while (low <= high){char temp = c[low];c[low] = c[high];c[high] = temp;low++;high--;}strcpy(s, c);
}int main()
{printf("-----unsignedstrtoint---------\n");char *s1 = "12345";int num1 = unsignedstrtoint(s1);printf("%d\n", num1);printf("-----strtoint---------\n");char *s2 = "12345";int num2 = strtoint(s2);printf("%d\n", num2);char s3[] = "+12345";num2 = strtoint(s3);printf("%d\n", num2);char *s4 = "-12345";num2 = strtoint(s4);printf("%d\n", num2);printf("-----unsignedinttostr---------\n");int num3 = 12345;char s5[6];memset(s5, 0, sizeof(s5));unsignedinttostr(num3, s5);printf("%s\n", s5);printf("-----inttostr---------\n");int num4 = -12345;char s6[6];memset(s6, 0, sizeof(s6));inttostr(num4, s6);puts(s6);num4 = +12345;memset(s6, 0, sizeof(s6));inttostr(num4, s6);puts(s6);num4 = 12345;memset(s6, 0, sizeof(s6));inttostr(num4, s6);puts(s6);system("pause");
}
运行效果如下:
26.【C语言】字符串转无符号整型unsignedint、字符串转有符号整型int、无符号整型unsignedint转字符串、有符号整型转字符串(5_task)相关推荐
- R语言dplyr包使用recode函数进行数据列内容编码、转换实战:类似于pandas中的map函数(例如,将内容从字符串映射到数值)
R语言dplyr包使用recode函数进行数据列内容编码.转换实战:类似于pandas中的map函数(例如,将内容从字符串映射到数值) 目录
- R语言ggplot2可视化:ggplot2可视化为轴标签添加复杂下标(Subscripts)和上标(superscripts)、离子化学符号(ionic chemical notation)等
R语言ggplot2可视化:ggplot2可视化为轴标签添加复杂下标(Subscripts)和上标(superscripts).离子化学符号(ionic chemical notation)等 目录
- R语言ggplot2可视化:使用patchwork包将两个ggplot2可视化结果横向构成新的结果可视化组合图(使用|符号)
R语言ggplot2可视化:使用patchwork包将两个ggplot2可视化结果横向构成新的结果可视化组合图(使用|符号) 目录
- 告别翻译机和第三方软件,微信自带3个功能轻松翻译26种语言!
出国留学.境外出差.旅游.社交办公等学习.工作和娱乐,如果自己不懂对方的语言,一般都会用 到翻译机和第三方翻译软件,当然了如果你的工作为你专门配备了一名翻译可以忽略了. 废话不多说,下面带大家看看微信 ...
- 【C语言】PAT(Basic Level) 1003 “答案正确”是自动判题系统给出的最令人欢喜的回复。 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。
规则 "答案正确"是自动判题系统给出的最令人欢喜的回复.本题属于 PAT 的"答案正确"大派送 -- 只要读入的字符串满足下列条件,系统就输出"答案正 ...
- C语言将一字符串输入到数组(长度不超过80)后将其输出, 将其中的英文字母大小写互换后再将整个字符串输出。
题目 将一字符串输入到数组(长度不超过80)后将其输出, 将其中的英文字母大小写互换后再将整个字符串输出. 代码 # include <stdio.h> # include <str ...
- 无界鼠标连接不上解决办法Mouse without Borders(无界鼠标)
无界鼠标连接不上解决办法Mouse without Borders(无界鼠标) 安装教程有很多.大家都知道了. 正好手里有台新装系统的电脑,又在学习Markdown,决定发第一篇.大家忽略排版的丑陋哈 ...
- C语言char*s 4,求讲解几道C语言的题 52 声明语句为“char s[4][15],*p1,**p2;int x,*y;”,下列语句中正...
求讲解几道C语言的题 52 声明语句为"char s[4][15],*p1,**p2:int x,*y:",下列语句中正 2018-6-15来自ip:14.144.15.70的网友 ...
- Waymo真·无人车将开上加州马路,却不是申请无司机路测第一家
夏乙 发自 凹非寺 量子位 出品 | 公众号 QbitAI 过不了多久,没有司机的Waymo无人车就要开上加州马路了. 据<旧金山纪事报>报道,Google的兄弟公司Alphabet本周提 ...
- 写一函数,实现两个字符串的比较。即自己写一个strcmp函数,函数原型为int strcmp(char * p1 ,char * p2); 设p1指向字符串s1, p2指向字符串s2。要求当s1=s2
写一函数,实现两个字符串的比较.即自己写一个strcmp函数,函数原型为int strcmp(char * p1 ,char * p2); 设p1指向字符串s1, p2指向字符串s2.要求当s1=s2 ...
最新文章
- 什么是Python?好学吗?
- 4.1 深层神经网络-深度学习-Stanford吴恩达教授
- Android - 网络基础
- MySQL之 从复制延迟问题排查
- .Net Core with 微服务 - 分布式事务 - 2PC、3PC
- Hibernate框架 简述
- C++——override
- ES6学习(八)—Promise对象 超鸡重要
- 熊猫concat()例子
- [CF920G]List Of Integers
- CLP 中关闭自动落实的问题
- git生成key以及小乌龟git不需要密码
- python编程从入门到实践(第2版)第二章练习题解答
- 安装装ankhsvn
- 中国黑客VS外国黑客,5分钟让你明白谁更技高一筹
- C语言二维数组范德蒙,2、编写一个程序,实现一个3×4矩阵转置。
- 融云 php sdk下载,Android 即时语音聊天工具 开发
- 牛津博士讲大数据和量化金融
- Kali LInux 下Osmocom-BB开源项目
- 谈学习中的改变——有病要诊断,有药要服用