鱼C论坛

 找回密码
 立即注册
查看: 1222|回复: 7

[已解决]带你飞C的39课2题答案真的正确吗?

[复制链接]
发表于 2018-7-8 15:15:05 | 显示全部楼层 |阅读模式

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

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

x
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. #define INCREMENT 10
  4. #define INIT_SIZE INCREMENT

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

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

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

  22.         last = num;

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

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

  35.         return num;
  36. }

  37. // 前后翻转字符串
  38. char *reverse_str(char *str)
  39. {
  40.         char *start = str;
  41.         char *left = str;
  42.         char ch;

  43.         if (str != NULL)
  44.         {
  45.                 // 定位到字符串的最后一个字符
  46.                 while (*str++)
  47.                         ;
  48.                 str -= 2;

  49.                 while (left < str)
  50.                 {
  51.                         ch = *left;
  52.                         *left++ = *str;
  53.                         *str-- = ch;
  54.                 }
  55.         }

  56.         return start;
  57. }

  58. char *append_result(char *result, char ch)
  59. {
  60.         char *last = result;
  61.         int limit = 0;
  62.         int times = 1;

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

  73.         last[limit - 1] = ch;
  74.         if (limit >= INCREMENT)
  75.         {
  76.                 result = (char *)realloc(result, INIT_SIZE + INCREMENT * times);
  77.                 last += INCREMENT;
  78.         }
  79.         last[limit] = '\0';

  80.         return result;
  81. }

  82. // 将两个字符串对应的数值相加
  83. char *add_two_strs(char *str1, char *str2)
  84. {
  85.         int carry = 0; // 存放进位
  86.         int num1, num2, num3;
  87.         char *result;

  88.         result = (char *)malloc(INIT_SIZE);
  89.         if (result == NULL)
  90.         {
  91.                 exit(1);
  92.         }

  93.         // 字符串的存放顺序跟加法规则相反
  94.         // 需要先反转字符串
  95.         str1 = reverse_str(str1);
  96.         str2 = reverse_str(str2);

  97.         // 两个字符串按位相加
  98.         while (*str1 != '\0' || *str2 != '\0')
  99.         {
  100.                 num1 = *str1 - '0';
  101.                 num2 = *str2 - '0';

  102.                 if (*str1 == '\0')
  103.                 {
  104.                         num1 = 0;
  105.                 }
  106.                 else
  107.                 {
  108.                         str1++;
  109.                 }

  110.                 if (*str2 == '\0')
  111.                 {
  112.                         num2 = 0;
  113.                 }
  114.                 else
  115.                 {
  116.                         str2++;
  117.                 }

  118.                 num3 = num1 + num2 + carry;
  119.                 if (num3 > 9)
  120.                 {
  121.                         append_result(result, num3 - 10 + '0');
  122.                         carry = 1;
  123.                 }
  124.                 else
  125.                 {
  126.                         append_result(result, num3 + '0');
  127.                         carry = 0;
  128.                 }
  129.         }

  130.         if (carry)
  131.         {
  132.                 append_result(result, carry + '0');
  133.         }

  134.         result = reverse_str(result);

  135.         return result;
  136. }

  137. int main(void)
  138. {
  139.         char *num1;
  140.         char *num2;
  141.         char *result;

  142.         num1 = get_num();
  143.         num2 = get_num();

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

  146.         return 0;
  147. }
复制代码




感觉好像不对,自己还在找原因
最佳答案
2018-7-8 21:51:41

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

        result = (char *)malloc(INIT_SIZE);
        if (result == NULL)
        {
                exit(1);
        }
                memset(result, 0, INIT_SIZE); // 初始化填0。因为字符串是以 \0为以束标志。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-7-8 18:49:45 | 显示全部楼层
代码被转化了,重新重上
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-8 20:45:41 | 显示全部楼层
ba21 发表于 2018-7-8 18:49
代码被转化了,重新重上

不是转化的问题,39课这个答案本身就有问题,不信你自己试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-8 20:47:17 | 显示全部楼层
ba21 发表于 2018-7-8 18:49
代码被转化了,重新重上
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. #define INCREMENT 10
  4. #define INIT_SIZE INCREMENT

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

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

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

  22. &#160; &#160;&#160; &#160;&#160;&#160;last = num;

  23. &#160; &#160;&#160; &#160;&#160;&#160;printf("请输入一个整数:");

  24. &#160; &#160;&#160; &#160;&#160;&#160;while ((ch=getchar()) != '\n')
  25. &#160; &#160;&#160; &#160;&#160;&#160;{
  26. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; last[limit++] = ch;
  27. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; if (limit >= INCREMENT)
  28. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; {
  29. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;num = (char *)realloc(num, INIT_SIZE + INCREMENT * times++);
  30. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;last += INCREMENT;
  31. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;limit = 0;
  32. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; }
  33. &#160; &#160;&#160; &#160;&#160;&#160;}
  34. &#160; &#160;&#160; &#160;&#160;&#160;last[limit] = '\0';

  35. &#160; &#160;&#160; &#160;&#160;&#160;return num;
  36. }

  37. // 前后翻转字符串
  38. char *reverse_str(char *str)
  39. {
  40. &#160; &#160;&#160; &#160;&#160;&#160;char *start = str;
  41. &#160; &#160;&#160; &#160;&#160;&#160;char *left = str;
  42. &#160; &#160;&#160; &#160;&#160;&#160;char ch;

  43. &#160; &#160;&#160; &#160;&#160;&#160;if (str != NULL)
  44. &#160; &#160;&#160; &#160;&#160;&#160;{
  45. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; // 定位到字符串的最后一个字符
  46. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; while (*str++)
  47. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;;
  48. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; str -= 2;

  49. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; while (left < str)
  50. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; {
  51. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;ch = *left;
  52. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;*left++ = *str;
  53. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;*str-- = ch;
  54. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; }
  55. &#160; &#160;&#160; &#160;&#160;&#160;}

  56. &#160; &#160;&#160; &#160;&#160;&#160;return start;
  57. }

  58. char *append_result(char *result, char ch)
  59. {
  60. &#160; &#160;&#160; &#160;&#160;&#160;char *last = result;
  61. &#160; &#160;&#160; &#160;&#160;&#160;int limit = 0;
  62. &#160; &#160;&#160; &#160;&#160;&#160;int times = 1;

  63. &#160; &#160;&#160; &#160;&#160;&#160;// 定位到字符串的末尾
  64. &#160; &#160;&#160; &#160;&#160;&#160;while (last[limit++] != '\0')
  65. &#160; &#160;&#160; &#160;&#160;&#160;{
  66. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; if (limit >= INCREMENT)
  67. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; {
  68. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;limit = 0;
  69. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;times++;
  70. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;last += INCREMENT;
  71. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; }
  72. &#160; &#160;&#160; &#160;&#160;&#160;}

  73. &#160; &#160;&#160; &#160;&#160;&#160;last[limit - 1] = ch;
  74. &#160; &#160;&#160; &#160;&#160;&#160;if (limit >= INCREMENT)
  75. &#160; &#160;&#160; &#160;&#160;&#160;{
  76. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; result = (char *)realloc(result, INIT_SIZE + INCREMENT * times);
  77. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; last += INCREMENT;
  78. &#160; &#160;&#160; &#160;&#160;&#160;}
  79. &#160; &#160;&#160; &#160;&#160;&#160;last[limit] = '\0';

  80. &#160; &#160;&#160; &#160;&#160;&#160;return result;
  81. }

  82. // 将两个字符串对应的数值相加
  83. char *add_two_strs(char *str1, char *str2)
  84. {
  85. &#160; &#160;&#160; &#160;&#160;&#160;int carry = 0; // 存放进位
  86. &#160; &#160;&#160; &#160;&#160;&#160;int num1, num2, num3;
  87. &#160; &#160;&#160; &#160;&#160;&#160;char *result;

  88. &#160; &#160;&#160; &#160;&#160;&#160;result = (char *)malloc(INIT_SIZE);
  89. &#160; &#160;&#160; &#160;&#160;&#160;if (result == NULL)
  90. &#160; &#160;&#160; &#160;&#160;&#160;{
  91. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; exit(1);
  92. &#160; &#160;&#160; &#160;&#160;&#160;}

  93. &#160; &#160;&#160; &#160;&#160;&#160;// 字符串的存放顺序跟加法规则相反
  94. &#160; &#160;&#160; &#160;&#160;&#160;// 需要先反转字符串
  95. &#160; &#160;&#160; &#160;&#160;&#160;str1 = reverse_str(str1);
  96. &#160; &#160;&#160; &#160;&#160;&#160;str2 = reverse_str(str2);

  97. &#160; &#160;&#160; &#160;&#160;&#160;// 两个字符串按位相加
  98. &#160; &#160;&#160; &#160;&#160;&#160;while (*str1 != '\0' || *str2 != '\0')
  99. &#160; &#160;&#160; &#160;&#160;&#160;{
  100. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; num1 = *str1 - '0';
  101. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; num2 = *str2 - '0';

  102. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; if (*str1 == '\0')
  103. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; {
  104. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;num1 = 0;
  105. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; }
  106. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; else
  107. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; {
  108. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;str1++;
  109. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; }

  110. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; if (*str2 == '\0')
  111. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; {
  112. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;num2 = 0;
  113. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; }
  114. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; else
  115. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; {
  116. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;str2++;
  117. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; }

  118. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; num3 = num1 + num2 + carry;
  119. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; if (num3 > 9)
  120. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; {
  121. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;append_result(result, num3 - 10 + '0');
  122. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;carry = 1;
  123. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; }
  124. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; else
  125. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; {
  126. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;append_result(result, num3 + '0');
  127. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;carry = 0;
  128. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; }
  129. &#160; &#160;&#160; &#160;&#160;&#160;}

  130. &#160; &#160;&#160; &#160;&#160;&#160;if (carry)
  131. &#160; &#160;&#160; &#160;&#160;&#160;{
  132. &#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; append_result(result, carry + '0');
  133. &#160; &#160;&#160; &#160;&#160;&#160;}

  134. &#160; &#160;&#160; &#160;&#160;&#160;result = reverse_str(result);

  135. &#160; &#160;&#160; &#160;&#160;&#160;return result;
  136. }

  137. int main(void)
  138. {
  139. &#160; &#160;&#160; &#160;&#160;&#160;char *num1;
  140. &#160; &#160;&#160; &#160;&#160;&#160;char *num2;
  141. &#160; &#160;&#160; &#160;&#160;&#160;char *result;

  142. &#160; &#160;&#160; &#160;&#160;&#160;num1 = get_num();
  143. &#160; &#160;&#160; &#160;&#160;&#160;num2 = get_num();

  144. &#160; &#160;&#160; &#160;&#160;&#160;result = add_two_strs(num1, num2);
  145. &#160; &#160;&#160; &#160;&#160;&#160;printf("计算结果是:%s\n", result);

  146. &#160; &#160;&#160; &#160;&#160;&#160;return 0;
  147. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-8 20:48:36 | 显示全部楼层

#include <stdio.h>
#include <stdlib.h>

#define INCREMENT 10
#define INIT_SIZE INCREMENT

char *get_num(void);
char *reverse_str(char *str);
char *add_two_strs(char *str1, char *str2);
char *append_result(char *result, char ch);

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

&#160; &#160;&#160; &#160;&#160;&#160;num = (char *)malloc(INIT_SIZE);
&#160; &#160;&#160; &#160;&#160;&#160;if (num == NULL)
&#160; &#160;&#160; &#160;&#160;&#160;{
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; exit(1);
&#160; &#160;&#160; &#160;&#160;&#160;}

&#160; &#160;&#160; &#160;&#160;&#160;last = num;

&#160; &#160;&#160; &#160;&#160;&#160;printf("请输入一个整数:");

&#160; &#160;&#160; &#160;&#160;&#160;while ((ch=getchar()) != '\n')
&#160; &#160;&#160; &#160;&#160;&#160;{
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; last[limit++] = ch;
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; if (limit >= INCREMENT)
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; {
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;num = (char *)realloc(num, INIT_SIZE + INCREMENT * times++);
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;last += INCREMENT;
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;limit = 0;
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; }
&#160; &#160;&#160; &#160;&#160;&#160;}
&#160; &#160;&#160; &#160;&#160;&#160;last[limit] = '\0';

&#160; &#160;&#160; &#160;&#160;&#160;return num;
}

// 前后翻转字符串
char *reverse_str(char *str)
{
&#160; &#160;&#160; &#160;&#160;&#160;char *start = str;
&#160; &#160;&#160; &#160;&#160;&#160;char *left = str;
&#160; &#160;&#160; &#160;&#160;&#160;char ch;

&#160; &#160;&#160; &#160;&#160;&#160;if (str != NULL)
&#160; &#160;&#160; &#160;&#160;&#160;{
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; // 定位到字符串的最后一个字符
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; while (*str++)
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;;
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; str -= 2;

&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; while (left < str)
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; {
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;ch = *left;
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;*left++ = *str;
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;*str-- = ch;
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; }
&#160; &#160;&#160; &#160;&#160;&#160;}

&#160; &#160;&#160; &#160;&#160;&#160;return start;
}

char *append_result(char *result, char ch)
{
&#160; &#160;&#160; &#160;&#160;&#160;char *last = result;
&#160; &#160;&#160; &#160;&#160;&#160;int limit = 0;
&#160; &#160;&#160; &#160;&#160;&#160;int times = 1;

&#160; &#160;&#160; &#160;&#160;&#160;// 定位到字符串的末尾
&#160; &#160;&#160; &#160;&#160;&#160;while (last[limit++] != '\0')
&#160; &#160;&#160; &#160;&#160;&#160;{
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; if (limit >= INCREMENT)
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; {
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;limit = 0;
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;times++;
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;last += INCREMENT;
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; }
&#160; &#160;&#160; &#160;&#160;&#160;}

&#160; &#160;&#160; &#160;&#160;&#160;last[limit - 1] = ch;
&#160; &#160;&#160; &#160;&#160;&#160;if (limit >= INCREMENT)
&#160; &#160;&#160; &#160;&#160;&#160;{
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; result = (char *)realloc(result, INIT_SIZE + INCREMENT * times);
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; last += INCREMENT;
&#160; &#160;&#160; &#160;&#160;&#160;}
&#160; &#160;&#160; &#160;&#160;&#160;last[limit] = '\0';

&#160; &#160;&#160; &#160;&#160;&#160;return result;
}

// 将两个字符串对应的数值相加
char *add_two_strs(char *str1, char *str2)
{
&#160; &#160;&#160; &#160;&#160;&#160;int carry = 0; // 存放进位
&#160; &#160;&#160; &#160;&#160;&#160;int num1, num2, num3;
&#160; &#160;&#160; &#160;&#160;&#160;char *result;

&#160; &#160;&#160; &#160;&#160;&#160;result = (char *)malloc(INIT_SIZE);
&#160; &#160;&#160; &#160;&#160;&#160;if (result == NULL)
&#160; &#160;&#160; &#160;&#160;&#160;{
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; exit(1);
&#160; &#160;&#160; &#160;&#160;&#160;}

&#160; &#160;&#160; &#160;&#160;&#160;// 字符串的存放顺序跟加法规则相反
&#160; &#160;&#160; &#160;&#160;&#160;// 需要先反转字符串
&#160; &#160;&#160; &#160;&#160;&#160;str1 = reverse_str(str1);
&#160; &#160;&#160; &#160;&#160;&#160;str2 = reverse_str(str2);

&#160; &#160;&#160; &#160;&#160;&#160;// 两个字符串按位相加
&#160; &#160;&#160; &#160;&#160;&#160;while (*str1 != '\0' || *str2 != '\0')
&#160; &#160;&#160; &#160;&#160;&#160;{
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; num1 = *str1 - '0';
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; num2 = *str2 - '0';

&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; if (*str1 == '\0')
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; {
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;num1 = 0;
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; }
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; else
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; {
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;str1++;
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; }

&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; if (*str2 == '\0')
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; {
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;num2 = 0;
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; }
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; else
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; {
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;str2++;
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; }

&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; num3 = num1 + num2 + carry;
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; if (num3 > 9)
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; {
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;append_result(result, num3 - 10 + '0');
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;carry = 1;
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; }
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; else
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; {
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;append_result(result, num3 + '0');
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;carry = 0;
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; }
&#160; &#160;&#160; &#160;&#160;&#160;}

&#160; &#160;&#160; &#160;&#160;&#160;if (carry)
&#160; &#160;&#160; &#160;&#160;&#160;{
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; append_result(result, carry + '0');
&#160; &#160;&#160; &#160;&#160;&#160;}

&#160; &#160;&#160; &#160;&#160;&#160;result = reverse_str(result);

&#160; &#160;&#160; &#160;&#160;&#160;return result;
}

int main(void)
{
&#160; &#160;&#160; &#160;&#160;&#160;char *num1;
&#160; &#160;&#160; &#160;&#160;&#160;char *num2;
&#160; &#160;&#160; &#160;&#160;&#160;char *result;

&#160; &#160;&#160; &#160;&#160;&#160;num1 = get_num();
&#160; &#160;&#160; &#160;&#160;&#160;num2 = get_num();

&#160; &#160;&#160; &#160;&#160;&#160;result = add_two_strs(num1, num2);
&#160; &#160;&#160; &#160;&#160;&#160;printf("计算结果是:%s\n", result);

&#160; &#160;&#160; &#160;&#160;&#160;return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-8 21:51:41 | 显示全部楼层    本楼为最佳答案   

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

        result = (char *)malloc(INIT_SIZE);
        if (result == NULL)
        {
                exit(1);
        }
                memset(result, 0, INIT_SIZE); // 初始化填0。因为字符串是以 \0为以束标志。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-8 23:31:34 | 显示全部楼层
ba21 发表于 2018-7-8 21:51
// 将两个字符串对应的数值相加
char *add_two_strs(char *str1, char *str2)
{

&#160; &#160;&#160; if (limit >= INCREMENT)
&#160; &#160;&#160; &#160;&#160;&#160;{
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; result = (char *)realloc(result, INIT_SIZE + INCREMENT * times);
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; 错误位置 last += INCREMENT;
                修改后    last = result;
&#160; &#160;&#160; &#160;&#160;&#160;}
&#160; &#160;&#160; &#160;&#160;&#160;last[limit] = '\0';


找了好半天终于找到:realloc指针会重新分配,所以last之前指向的指针就不存在了,'\0'没给到,就会造成后面的连锁赋值错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-9 21:00:07 | 显示全部楼层
ba21 发表于 2018-7-8 21:51
// 将两个字符串对应的数值相加
char *add_two_strs(char *str1, char *str2)
{

出来道个歉就算了老师,希望以后你能多帮助我
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 20:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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