整数拆分依次存入字符数组
给定一串整数,该如何存入字符数组,这在软件编程看来,似乎不是很必要的,尤其在接下来的操作中,会有把数组不停位移的操作,原因很简单:
写这篇文章的时候,我主要用在单片机开发上,我尽量把代码写成可修改的样式,便于再利用,包括里面的字符数组TemArray_Result[Size],Size其实是可以修改的,只不过是重定义的问题,用动态分配内存方式就可以解决:
int arr[n];
p=(int )malloc(nsizeof(int));
下面,依次讲解下我的解题思路。
一、声明变量
其实也没什么可声明的,毕竟就一个东西,待存入数串(代指待拆分的整数)的字符数组。所以我干脆就把头文件、常量之类的放一起吧。
对了,我用的是使用了38译码器的8位数码管。
#include<stdio.h>
#include<string.h>
// -----------------
#define Size 8 // 数串范围限制,因为使用的是8位数码管,所以限制是8
// -----------------
char TemArray_Result[8] = {'0','0','0','0','0','0','0','0'}; // 待存入的字符数组
char temResult[Size]; // 临时中转字符串,当作中转的字符串
int countZero = 0; // 末尾0计数
// -----------------
二、整数放入字符串
很简单的,使用sprintf()函数就可以实现了。
补充下:
temporaryResult就是输入的整数,准备要被切割的,正数也好,负数也罢,割就对了。
sprintf(temResult,"%d",temporaryResult);
到这里,是不是以为就结束了?
没错,讲到这里,确实结束了,现在已经可以使用了,其实也就一个sprintf()函数,记住,它很强大。
但如果你还有别的需求,比如……eee
放到数码管,并用switch()展示对应的符号、数字,这样的话,你这遍历,可就出了问题啊,毕竟,你也不知道你输入的是几位数字,对吧,当然,假设你知道几位,那么数码管显示的时候也需要遍历8个位,如果其他没用的位不置零,就不妥了,或者说,会异常发光,哈哈。
所以,如果有兴趣就接着往下看,最后处理结果自己往下滑到底端。
三、计算末尾含0的个数
因为一会要进行“清零”操作 – 把你输入的数字末尾0全部清除,为了保存这仅存的希望,或者说是不乱杀无辜,那咋办,就存 0 呗,待会再加回来。
for(int i = strlen(temResult) - 1; temResult[i] == '0'; i --)
countZero ++;
四、判断输入的量是否超出Size(8位)
// 检测该数串是否超出8位
if((strlen(temResult) >= 0) && (strlen(temResult) <= Size))
{
// 重要代码,往下看
}
// 如果超出Size位(即超8位溢出),执行溢出函数
else
overflowDigits();// 溢出函数,自己写的,在这就不提及了
五、逐个把中转字符串内容放入字符数组
前提是if()语句成立!!!
// 逐个放入Result的字符数组
for(int i = 0; i < strlen(temResult); i ++)
TemArray_Result[i] = temResult[i];
执行完后,存入的数如果不够Size位,最后的就会依然还是’0’。
为了正确显示数字,下面开始,清零。
同时,因为刚才已经计算好了原先数串末尾有几个0,所以哈哈,随便清零,问题不大。
for(int j = (Size - 1); TemArray_Result[j] == '0'; )
{
for(int i = 1; i < Size; i ++)
TemArray_Result[Size - i] = TemArray_Result[Size - i - 1];
TemArray_Result[0] = '0';
}
六、添零骚操作
前提是if()语句成立!!!
通过countZero = ? 判断原先零的个数,并重新在末尾添加零。
for(int i = 0; i < countZero; i ++)
{
for(int i = 0; i < (Size - 1); i ++)
TemArray_Result[i] = TemArray_Result[i + 1];
TemArray_Result[7] = '0';
}
七、完整程序
#include<stdio.h>
#include<string.h>
// -------------------------------------------------------------
#define Size 8 // 数串范围限制,因为使用的是8位数码管,所以限制是8
// -------------------------------------------------------------
char TemArray_Result[8] = {'0','0','0','0','0','0','0','0'}; // 待存入的字符数组
// ----------------------------------------------------------------------
/**
** 拆分函数
** temporaryResult:待拆分的整数
*/
void spiltResult(int temporaryResult)
{
char temResult[Size]; // 临时中转字符串
int countZero = 0; // 末尾0计数
// -----------------------------------
// 把整数放入临时字符串,再拆分并转成放入TemArray_Result字符数组
sprintf(temResult,"%d",temporaryResult);
// -----------------------------------
// 计算末位有几个0
for(int i = strlen(temResult) - 1; temResult[i] == '0'; i --)
countZero ++;
// -----------------------------------
// 检测该数串是否超出8位
if((strlen(temResult) >= 0) && (strlen(temResult) <= Size))
{
// 逐个放入Result的字符数组
for(int i = 0; i < strlen(temResult); i ++)
TemArray_Result[i] = temResult[i];
// -----------------------------------
// 如果末尾为0,退格,但若是尾数是0的结果会出问题,所以后面还有一个添零操作
for(int j = (Size - 1); TemArray_Result[j] == '0'; )
{
for(int i = 1; i < Size; i ++)
TemArray_Result[Size - i] = TemArray_Result[Size - i - 1];
TemArray_Result[0] = '0';
}
// -----------------------------------
// 判断原先0的个数,并重新在末尾添加零
for(int i = 0; i < countZero; i ++)
{
for(int i = 0; i < (Size - 1); i ++)
TemArray_Result[i] = TemArray_Result[i + 1];
TemArray_Result[7] = '0';
}
}
// -----------------------------------
// 如果超出Size位(即超8位溢出),执行溢出函数
else
overflowDigits();
}
// ----------------------------------------------------------------------
/**
** 结果位数溢出处理函数
*/
void overflowDigits()
{
CEResult();
}
// ----------------------------------------------------------------------
/**
** 置零函数
** 将TemArray_Result[N]全部置零
*/
void CEResult()
{
for(int i = 0; i < Size; i ++)
TemArray_Result[i] = '0';
}
// ----------------------------------------------------------------------
int main()
{
spiltResult(1234); // 正整数
for(int i = 0; i < Size; i ++)
printf("%d:%c\n",i+1,TemArray_Result[i]);
CEResult(); // 清零
printf("--------------------------------------\n");
spiltResult(123400); // 末尾含0正整数
for(int i = 0; i < Size; i ++)
printf("%d:%c\n",i+1,TemArray_Result[i]);
CEResult(); // 清零
printf("--------------------------------------\n");
spiltResult(-1234); // 负整数
for(int i = 0; i < Size; i ++)
printf("%d:%c\n",i+1,TemArray_Result[i]);
CEResult(); // 清零
printf("--------------------------------------\n");
spiltResult(-1020300); // 末尾含0负整数
for(int i = 0; i < Size; i ++)
printf("%d:%c\n",i+1,TemArray_Result[i]);
CEResult(); // 清零
printf("--------------------------------------\n");
spiltResult(123456789); // 超过Size溢出数
for(int i = 0; i < Size; i ++)
printf("%d:%c\n",i+1,TemArray_Result[i]);
return 0;
}
至此,全部over!
补充下:有些函数只是为了看结果的时候方便。
包括main()函数很多内容都是为了结果!!!!
接下来,看图吧。