鱼C论坛

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

求助

[复制链接]
发表于 2023-1-2 20:25:34 | 显示全部楼层 |阅读模式

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

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

x
  1. char *append_result(char *result, char ch)
  2. {
  3.         char *last = result;
  4.         int limit = 0;
  5.         int times = 1;

  6.         // 定位到字符串的末尾
  7.         while(last[limit++] != '\0')
  8.         {
  9.                 if(limit >= INCREMENT)
  10.                 {
  11.                         limit = 0;
  12.                         times++;
  13.                         last += INCREMENT;
  14.                 }
  15.         }

  16.         last[limit - 1] = ch;
  17.         if(limit >= INCREMENT)
  18.         {
  19.                 int offset = last - result;
  20.                 result = (char *)realloc(result, INIT_SIZE + INCREMENT * times);
  21.                 last = result;
  22.                 last += offset;
  23.                 last += INCREMENT;
  24.                 limit = 0;                // reset
  25.         }
  26.         last[limit] = '\0';

  27.         return result;
  28. }

  29. // 将两个字符串对应的数值相加
  30. char *add_two_strs(char *str1, char *str2)
  31. {
  32.         int carry = 0; // 存放进位
  33.         int num1, num2, num3;
  34.         char *result;

  35.         result = (char *)malloc(INIT_SIZE);
  36.         if(result == NULL)
  37.         {
  38.                 exit(1);
  39.         }

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

  41.         // 字符串的存放顺序跟加法规则相反
  42.         // 需要先反转字符串
  43.         str1 = reverse_str(str1);
  44.         str2 = reverse_str(str2);

  45.         // 两个字符串按位相加
  46.         while(*str1 != '\0' || *str2 != '\0')
  47.         {
  48.                 num1 = *str1 - '0';
  49.                 num2 = *str2 - '0';

  50.                 if(*str1 == '\0')
  51.                 {
  52.                         num1 = 0;
  53.                 }
  54.                 else
  55.                 {
  56.                         str1++;
  57.                 }

  58.                 if(*str2 == '\0')
  59.                 {
  60.                         num2 = 0;
  61.                 }
  62.                 else
  63.                 {
  64.                         str2++;
  65.                 }

  66.                 num3 = num1 + num2 + carry;
  67.                 if(num3 > 9)
  68.                 {
  69.                         result = append_result(result, num3 - 10 + '0');
  70.                         carry = 1;
  71.                 }
  72.                 else
  73.                 {
  74.                         result = append_result(result, num3 + '0');
  75.                         carry = 0;
  76.                 }
  77.         }
  78.    
  79.         if(carry)
  80.         {
  81.                 append_result(result, carry + '0');
  82.         }

  83.         result = reverse_str(result);

  84.         return result;
  85. }

  86. int main(void)
  87. {
  88.         char *num1;
  89.         char *num2;
  90.         char *result;

  91.         num1 = get_num();//该函数将输入的数字以字符类型传入指针数组
  92.         num2 = get_num();

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

  95.         return 0;  
  96. }
复制代码


这段代码我想问一下是怎么实现定位到字符串末尾的,result指针定义之后也没有赋值,那last【limit】又有什么意义呢
  1. // 定位到字符串的末尾
  2.         while(last[limit++] != '\0')
  3.         {
  4.                 if(limit >= INCREMENT)
  5.                 {
  6.                         limit = 0;
  7.                         times++;
  8.                         last += INCREMENT;
  9.                 }
  10.         }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-1-3 07:37:19 | 显示全部楼层
看不懂啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-3 16:42:18 | 显示全部楼层
本帖最后由 两手空空儿 于 2023-1-3 16:45 编辑
  1. // 定位到字符串的末尾
  2.         while(last[limit++] != '\0')    //找到\0的位置就是末尾了,只不过它记录位置的方法是通过 INCRMENT * time + limit 的方式
  3.         {
  4.                 if(limit >= INCREMENT)
  5.                 {
  6.                         limit = 0;
  7.                         times++;
  8.                         last += INCREMENT;
  9.                 }
  10.         }
复制代码


  1. if(limit >= INCREMENT)
  2.         {
  3.                 int offset = last - result;
  4.                 result = (char *)realloc(result, INIT_SIZE + INCREMENT * times);   
  5.                                 //这里用的是realloc,result被重新分配内存以后,原来的内容会被复制到新的内存单元中,所以这里result指向的内容和原来的内容是一样的,
  6.                                 // last[limit]修改的内容就是result指向的内容
  7.                 last = result;
  8.                 last += offset;
  9.                 last += INCREMENT;
  10.                 limit = 0;                // reset
  11.         }
  12.         last[limit] = '\0';
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-22 22:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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