数字字符串转为数字 C语言实现

数字字符串转为数字 C语言实现

在Java中经常用到一个操作,数字字符串转为数字,Integer.parseInt()方法给出来满意的解决方法,但是C语言怎么实现呢,其实也有方法,先买个关子,其实我想做的的事情是不依赖于标准函数库,自己写一个程序实现。
一时兴起,想到的一个操作,数字字符串如何转数组呢???问了一下度娘,没找到满意的回答,笔者琢磨则自己写一个,并且还准备了几份惊喜,话不多说,直接上干货,如下代码:

//此函数需要特别注意数据类型 
//任何时候涉及浮点数的运算都用double 
//pow()返回值为double 必须要保证传入的参数至少有一个为double类型 
//pow()函数返回类型是double 确保精度足够 便于浮点运算  
#include<stdio.h>
#include<math.h>
#include<string.h>
main(){
	double n[10],s=0;
	char str[10];
	int len;
	gets(str);
	len= strlen(str);
	for(int i=0;i<len;i++){
		n[i]=(double)str[i]-48;
		//以下len-i-1为int类型 强转为(double) 
		s+=pow(10,len-1-i)*n[i]; 
	}
	printf("转换后的数字为:%.0f",s);
}

运行截图↓↓↓
在这里插入图片描述
该部分代码虽未涉及字符串转数字函数atoi(),但涉及到了math.h 和 string.h
头文件 求数的幂运算和字符串长度的时候偷了一下懒。不行不行,俺要闭门造车,不要拦着我,于是接下来我自己写个函数求数的幂运算和字符串长度,不要拦着我!!!代码如下(DIYpow()是函数体 可直接使用)↓↓↓

//DIYpow函数 
#include<stdio.h>
double DIYpow(double a,double b){
	//求a的b次方 a为底数 b为指数
	double s=1.0;	//s用于存储最终结果 
	for(int i=0;i<b;i++){
		s*=a; 
	} 
	return s;
}
int main(){
	double a,b;
	scanf("%lf%lf",&a,&b);
	double val = DIYpow(a,b);
	printf("%lf",DIYpow(a,b));
}

来看看效果:
在这里插入图片描述
哈哈,第一次尝试成功了,给了笔者更大的信心,来,求下字符串长度,呼唤指针,呼唤指针,呼唤指针,指针来也,如下代码:
//DIYstrlen()函数 指针实现

#include<stdio.h>
int DIYstrlen(char *p){
	int n=0;
	while(*p++)
		n++;
	return n;
}
int main(){
	//定义指针p指向str字符串(C语言用字符数组表示)
	char str[10];	 
	scanf("%s",str);
	DIYstrlen(str);
	printf("字符串长度为:%d",DIYstrlen(str));	
}

神奇的指针充当着什么角色了,不急,且先看看效果图:
在这里插入图片描述
不错不错 被指针这么一指,字符串的长度乖乖现形了。

刚刚哪里偷懒来着??好像是求数的幂运算和字符串长度,没错,这不正好自己把轮子造出来了吗,就差组装了,来看看组装后的代码吧:

#include<stdio.h>
int DIYstrlen(char *p){
	int n=0;
	while(*p++)
		n++;
	return n;
}

double DIYpow(double a,double b){
	//求a的b次方 a为底数 b为指数
	double s=1.0;	//s用于存储最终结果 
	for(int i=0;i<b;i++){
		s*=a; 
	} 
	return s;
}

main(){
	double n[10],s=0;
	char str[10];
	int len;
	scanf("%s",str);
	len= DIYstrlen(str);
	for(int i=0;i<len;i++){
		n[i]=(double)str[i]-48;
		//以下len-i-1为int类型 强转为(double) 
		s+=DIYpow(10,len-1-i)*n[i]; 
	}
	printf("转换后的数字为:%.0f",s);
}

组装后的效果来袭:
在这里插入图片描述
至此该函数的DIY就完全结束了,以上的程序有以下需要注意的几点,如下

  1. 第一段代码字符串输入用get(),之后用的scanf() gets()可读取空格 回车结束 scanf() 遇到空格即结束
  2. 以上程序未做异常处理 输入时只能输入数字字符串 且限定了长度10,可根据实际需要修改字符串长度
  3. 以上程序特别特别注意pow()/DIYpow()函数返回double类型 运算时为了保证结果准确性,在大部分的地方可将int转为double
  4. *s+=pow/DIYpow(10,len-1-i)n[i] 该部分一定要注意 先计算完pow()/DIYpow()函数的值再乘以对应值
  5. 程序设计过程中有一个难点是将字符串转为数字数组后如何得到目标数字,其实很简单 用数组的 第i项乘以10^(n-1-i) 设置一个变量求和即可

转载请注明:https://blog.csdn.net/ACDSee9/article/details/113791720

  • 7
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值