镜缘浮影 小人本住在 苏州的城外 家里有屋又有田 生活乐无边

那些年我们一起忘掉的C (九).字符串转数值

2016-11-23
wilmosfang
c
原文地址 http://soft.dog/2016/11/23/c-basic-09/

前言

模块化是程序设计过程中很重要的思想,将复杂的计算过程外包给其它函数,可以简化代码结构

字符串与数字值的转化包含了最基础的转码思想


概要


数字字符串转化为相应的数字

写一个函数实现将任意位数(<=4)数字字符串(0-9)转化为相应的数字,如:将 “123”转化成 123

int str2num(char *s); // 注意输入字符串的检查,必须全部是数字

main(){ ...; r=str2num("1234");}

代码注解

#include <stdio.h>
#include <string.h> //求字符串长度的函数strlen,需要这个头文件被包含
#define LENGTH 10 //通过在这里定义宏,可以方便地进行全局修改

int mi(int n) //定义一个根据数位反馈权值的函数,接受一个整型位数n,反馈幂值
{
	return (n==1)?1:10*mi(n-1); // 反馈10的n-1次方作为权值
}

int checkstr(char *sp) //定义一个函数,检查指定字符串中是否包含非法字符
{
	char *p;
	for(p=sp;*p != '\0';p++) //遍历每个字符
	{
		if (*p < '0' || *p > '9') //如果这个字符不在['0','9']的范围里,则属于非法字符
		{
			printf ("please reinput the number string, error number %c\n",*p); //将非法字符打印出来
			return 0;		//遇到非法字符返回0
		}
	}
	return 1;		//检查正常返回1
}

int str2num(char *sp)	//定义一个字符串转数值的函数,接受一个字符指针作为参数
{
	int len,sum=0;
	char *p;
	len=strlen(sp);		//计算出字符串长度,并且保存到len中
	for(p=sp;*p != '\0';p++,len--) sum+= (*p-'0') * mi(len); //遍历字符串中每个元素,并且将其转化为数值后乘以权重累计到sum中,这里调用了上面定义的幂函数
	return sum;			//将数值返回
}

main()
{
	char s[LENGTH];
	printf("please input a number string (less then %d chars):\n",LENGTH);
	scanf("%s",s); //将输入的字符串保存到字符数组s中
	if (checkstr(s) == 0) return 0; //如果检查不通过,则直接返回
	printf("the string is %s\n",s); 
	printf("the sum is %d\n",str2num(s)); //将数字字符串进行转化,并且直接将结果进行输出
    return 0;	//输入->检查->转化->输出  这个处理流程就变得很清晰了
}

思路

将输入字符串进行保存,然后检查,然后转化翻译为数值,然后输出

数字字符串中的每一位都有不同的权重,在转化为数值的过程中要将权重考虑在内

基础知识点

  • 指针的用法
  • 函数的定义
  • 指针作为函数参数
  • 函数的调用
原文地址 http://soft.dog/2016/11/23/c-basic-09/

评论