鱼C论坛

 找回密码
 立即注册
查看: 788|回复: 2

[已解决]字符串加法为什么要翻转呢?

[复制链接]
发表于 2021-9-25 10:24:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
C语言第39课作业题
字符串的加法,第122行的注释是什么意思啊

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. #define INCREMENT 10
  5. #define INIT_SIZE INCREMENT

  6. char *get_num(void);
  7. char *reverse_str(char *str);
  8. char *add_two_strs(char *str1, char *str2);
  9. char *append_result(char *result, char ch);

  10. // 获取用户输入的整数
  11. char *get_num(void)
  12. {
  13.         char ch;
  14.         char *num; // 存储整个数据的首地址
  15.         char *last; // 最近一次迭代的起始地址
  16.         int limit = 0; // 每次迭代的限制值
  17.         long times = 1; // 记录重新申请多少次内存

  18.         num = (char *)malloc(INIT_SIZE);
  19.         if(num == NULL)
  20.         {
  21.                 exit(1);
  22.         }

  23.         last = num;

  24.         printf("请输入一个整数:");

  25.         while((ch = getchar()) != '\n')
  26.         {
  27.                 last[limit++] = ch;
  28.                 if(limit >= INCREMENT)
  29.                 {
  30.                         int offset = last - num;
  31.                         num = (char *)realloc(num, INIT_SIZE + INCREMENT * times++);
  32.                         last = num;
  33.                         last += offset;
  34.                         last += INCREMENT;
  35.                         limit = 0;
  36.                 }
  37.         }
  38.         last[limit] = '\0';

  39.         return num;
  40. }

  41. // 前后翻转字符串
  42. char *reverse_str(char *str)
  43. {
  44.         char *start = str;
  45.         char *left = str;
  46.         char ch;

  47.         if(str != NULL)
  48.         {
  49.                 // 定位到字符串的最后一个字符
  50.                 while(*str++)
  51.                         ;
  52.                 str -= 2;

  53.                 while(left < str)
  54.                 {
  55.                         ch = *left;
  56.                         *left++ = *str;
  57.                         *str-- = ch;
  58.                 }
  59.         }

  60.         return start;
  61. }

  62. char *append_result(char *result, char ch)
  63. {
  64.         char *last = result;
  65.         int limit = 0;
  66.         int times = 1;

  67.         // 定位到字符串的末尾
  68.         while(last[limit++] != '\0')
  69.         {
  70.                 if(limit >= INCREMENT)
  71.                 {
  72.                         limit = 0;
  73.                         times++;
  74.                         last += INCREMENT;
  75.                 }
  76.         }

  77.         last[limit - 1] = ch;
  78.         if(limit >= INCREMENT)
  79.         {
  80.                 int offset = last - result;
  81.                 result = (char *)realloc(result, INIT_SIZE + INCREMENT * times);
  82.                 last = result;
  83.                 last += offset;
  84.                 last += INCREMENT;
  85.                 limit = 0;                // reset
  86.         }
  87.         last[limit] = '\0';

  88.         return result;
  89. }

  90. // 将两个字符串对应的数值相加
  91. char *add_two_strs(char *str1, char *str2)
  92. {
  93.         int carry = 0; // 存放进位
  94.         int num1, num2, num3;
  95.         char *result;

  96.         result = (char *)malloc(INIT_SIZE);
  97.         if(result == NULL)
  98.         {
  99.                 exit(1);
  100.         }

  101.         result[0] = '\0';                // 需要 '\0'

  102.         // 字符串的存放顺序跟加法规则相反
  103.         // 需要先反转字符串
  104.         str1 = reverse_str(str1);
  105.         str2 = reverse_str(str2);

  106.         // 两个字符串按位相加
  107.         while(*str1 != '\0' || *str2 != '\0')
  108.         {
  109.                 num1 = *str1 - '0';
  110.                 num2 = *str2 - '0';

  111.                 if(*str1 == '\0')
  112.                 {
  113.                         num1 = 0;
  114.                 }
  115.                 else
  116.                 {
  117.                         str1++;
  118.                 }

  119.                 if(*str2 == '\0')
  120.                 {
  121.                         num2 = 0;
  122.                 }
  123.                 else
  124.                 {
  125.                         str2++;
  126.                 }

  127.                 num3 = num1 + num2 + carry;
  128.                 if(num3 > 9)
  129.                 {
  130.                         result = append_result(result, num3 - 10 + '0');
  131.                         carry = 1;
  132.                 }
  133.                 else
  134.                 {
  135.                         result = append_result(result, num3 + '0');
  136.                         carry = 0;
  137.                 }
  138.         }
  139.    
  140.         if(carry)
  141.         {
  142.                 append_result(result, carry + '0');
  143.         }

  144.         result = reverse_str(result);

  145.         return result;
  146. }

  147. int main(void)
  148. {
  149.         char *num1;
  150.         char *num2;
  151.         char *result;

  152.         num1 = get_num();
  153.         num2 = get_num();

  154.         result = add_two_strs(num1, num2);
  155.         printf("计算结果是:%s\n", result);

  156.         return 0;
  157. }
复制代码
最佳答案
2021-9-25 12:47:51
小学做加法列竖式,从低位开始计算,所以需要反转
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-9-25 12:47:51 | 显示全部楼层    本楼为最佳答案   
小学做加法列竖式,从低位开始计算,所以需要反转
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-25 13:17:31 | 显示全部楼层
灰色的天空 发表于 2021-9-25 12:47
小学做加法列竖式,从低位开始计算,所以需要反转

en,我没看到最后result还翻转了一次,一直在想这玩意翻转了咋输出
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-26 03:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表