华硕|C语言-字符串相加考虑进位

华硕|C语言-字符串相加考虑进位


①命令行
#include<stdio.h>
#include<string.h>
~
②定义函数-初始化
/*定义函数和字符串变量 。 */
char *fun(char *s1char *s2char *r)
/*初始化 , 即赋初值 。 */
{int lency=0md;
char *p*q*t;
len=strlen(s1);
/*len=s1的长度=s2的长度 。 */
p=s1+len-1;
/*p用于储存 , s1用于移动 。
s1为数组名 , 指向数组首地址 。 指针s1向后移动len-1位 , 即指向字符串最后一位 。 */
q=s2+len-1;
/*q用于储存 , s2用于移动 。
s2为数组名 , 指向数组首地址 。 指针s2向后移动len-1位 , 即指向字符串最后一位 。 */
t=r+len;
/*t用于存储p和q指向字符相加的结果 ,
r用于移动 , 指向相加后数据首地址 , 可能产生进位 , 多预留一位 , 即len不减1 。 */
*(t+1)='\\0';
/*因为预留一位 , 所以字符串结束字符也向后移动一位 。 */

③定义函数-循环函数
while(p>=s1)
{md=*p-'0'+*q-'0'+cy;
/*md表示made decimal创建十进制数 , 即字符串相加后的数值 。 星p-'0'表示将字符转换成数值 。 */
if(md>=10) cy=1;
else cy=0;
/*cy表示carry 进位标志位 。 初始值为0 , 如果有进位 , cy为1 , 下次循环时 , 加在更高一位上 。 */
*t=md%10+'0';
/*星t用于储存 , md用于计算 , cy用于传递进位 。
因为进位md可能大于10 , 所以取余取个位 , +'0'转变为ASCLL码值 。 */
p--;q--;t--;
/*向前移动 , 个位加完 , 加十位 。 */

④定义函数-循环结束
if(cy==1) *t='1';
/*循环结束 , 即p<s1 , 由于p移动方向是向高位 , 此时p指向最高位 。
如果cy==1 , 表示进位 , 令指针星t当前处为1 。 */
else while(*r++=*++t);
/*如果cy==0 , 表示最高位没有数 , 令指针星t从当前处后移一位到有数的地方 。 */
return r;
/*相加后r所指字符串作为返回值 。 */

~
⑤主函数
void main()
{char s1[100
s2[100
s3[101
;
/*s123是用于存储字符串的数组 , 考虑相加后可能有进位 , s3开辟101位储存空间 。 */
strcpy(s1\"12345\");
/*初始化s12 , 即赋初值 。 */
strcpy(s2\"54321\");
fun(s1s2s3);
printf(\"%s+%s=%s\\"s1s2s3)


⑥思路
1.字符串:s1 , s2 , s3(形参r)
2.字符转换成数值
借助指针:p , q , t
转换成ASCLL码值
即数值:*p , *q , *t
转换成对应整数
即数值:*p-'0' , *q-'0' , md%10+'0'
3.数值转换成字符串:r
【华硕|C语言-字符串相加考虑进位】即r所指的字符串 。