鱼C论坛

 找回密码
 立即注册
查看: 3630|回复: 15

为什么越界

[复制链接]
发表于 2022-9-27 16:57:43 | 显示全部楼层 |阅读模式

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

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

x

void reverse (char *s)
{
    int lens=strlen(s);
    int i,t;
    for(i=0;i<(lens/2);i++)
    {
        t=s[i];
        s[i]=s[lens-1-i];
        s[lens-1-i]=t;
    }
}


char * addBinary(char * a, char * b){
    int a1=1,b1=1,sum1=0,sum2=0,sum,d=2;
    int i,j;
    int length1,length2;
    length1=strlen(a);
    length2=strlen(b);
        for(i=0;i<length1;i++)
    {   
            sum1=sum1*2;
            sum1+=a[i]-'0';
    }
        
    for(j=0;j<length2;j++)
    {
       sum2=sum2*2;
       sum2+=b[i]-'0';
    }      
            sum=sum1+sum2;
             char *c=(char *)malloc(length1>length2?(length1+2):(length2+2));
    for(i=0;d>=2;i++)
    {
        c[i]=sum%2+'\0';
        d=sum/2;
    }
    reverse(c);
    return c;
}


111.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-9-27 18:17:12 | 显示全部楼层
本帖最后由 jackz007 于 2022-9-27 19:34 编辑
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. char * addBinary(char a[] , char b[])
  4. {
  5.         char s[4096] = {0} , x1 , x2 , * p                  ;
  6.         int c , d , e , i , n                               ;
  7.         for(c = 0 ; a[c] ; c ++)                            ;  // c = a 的长度
  8.         for(d = 0 ; b[d] ; d ++)                            ;  // d = b 的长度
  9.         for(i = e = 0 , n = (c < d) ? d : c ; i < n ; i ++) {  // 加法计算按长字符串长度安排循环
  10.                 s[i] = e                                    ;
  11.                 x1 = (i < c) ? a[c - i - 1] : '0'           ;  // 短字符串的不足部分一律按字符 '0' 充数
  12.                 x2 = (i < d) ? b[d - i - 1] : '0'           ;
  13.                 s[i] = s[i] + x1 - '0' + x2 - '0'           ;
  14.                 e = s[i] / 2                                ;  // 2 就是二进制的二
  15.                 s[i] %= 2                                   ;  // 2 就是二进制的二
  16.         }
  17.         if(e) s[n ++] = e                                   ;
  18.         p = (char *) malloc(n + 1)                          ;
  19.         for(i = 0 ; i < n ; i ++) p[i] = s[n - i - 1] + '0' ;
  20.         p[n] = '\0'                                         ;
  21.         return p                                            ;
  22. }

  23. int main(void)
  24. {
  25.         char a[3] = {"11"} , b[2] = {"1"} , * p             ;
  26.         p = addBinary(a , b)                                ;
  27.         printf("%s\n" , p)                                  ;
  28.         free(p)                                             ;
  29. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-27 20:19:40 | 显示全部楼层
本帖最后由 jhq999 于 2022-9-27 20:23 编辑
  1. #include <stdio.h>
  2. char* sum(char *s1,char *s2)
  3. {
  4.     int i=0,j=0,k=0;
  5.     char* t=NULL;
  6.     for(i=0;s1[i];i+=1);
  7.     for(j=0;s2[j];j+=1);
  8.     if(i<j)
  9.     {
  10.         t=s1,s1=s2,s2=t;
  11.         i=i+j,j=i-j,i=i-j;
  12.     }
  13.     i+=1;
  14.     for(k=i;k>0;k-=1)s1[k]=s1[k-1];
  15.     s1[0]='0';
  16.     for(k=i;j>=0;j-=1,i-=1)
  17.     {
  18.         s1[i]+=s2[j]-'0';
  19.     }
  20.     for(i=k;i>=0;i-=1)
  21.     {
  22.         if('2'==s1[i])s1[i]='0',s1[i-1]+=1;
  23.         else if('3'==s1[i])s1[i]='1',s1[i-1]+=1;
  24.     }
  25.     for(i=0;'0'==s1[i];i+=1);
  26.     return s1+i;
  27. }
  28. int main(void)
  29. {
  30.     char s1[256]={0},s2[256]={0};
  31.     scanf("%s %s",s1,s2);
  32.     printf("%s",sum(s1,s2));
  33.     return 0;
  34. }
复制代码
  1. 110101 111010011
  2. 1000001000
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-27 20:21:15 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-27 20:24:59 | 显示全部楼层
人造人 发表于 2022-9-27 20:21
我不理解
https://fishc.com.cn/thread-218109-1-1.html

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-27 20:49:37 | 显示全部楼层
人造人 发表于 2022-9-27 20:21
我不理解
https://fishc.com.cn/thread-218109-1-1.html

我错了,我怕把你问烦了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-27 20:50:57 | 显示全部楼层
所以又开了一个问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-27 20:55:07 | 显示全部楼层
addendum777 发表于 2022-9-27 20:50
所以又开了一个问题
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. void reverse(char *s) {
  5.     int lens = strlen(s);
  6.     int i, t;
  7.     for(i = 0; i < (lens / 2); i++) {
  8.         t = s[i];
  9.         s[i] = s[lens - 1 - i];
  10.         s[lens - 1 - i] = t;
  11.     }
  12. }

  13. char *addBinary(char *a, char *b) {
  14.     int sum1 = 0, sum2 = 0, sum;
  15.     int j;
  16.     int length1, length2;
  17.     length1 = strlen(a);
  18.     length2 = strlen(b);
  19.     /*
  20.     for(j = 0; j < length1; j++) {
  21.         a1 = a[i];
  22.         for(i = length1 - 1; i > 0; i--) {
  23.             a1 = 2 * a1;
  24.         }
  25.         sum1 += a1;
  26.     }
  27.     */
  28.     for(j = 0; j < length1; j++) {
  29.         sum1 *= 2;
  30.         sum1 += a[j] - '0';
  31.     }
  32.     /*
  33.     for(j = 0; j < longth2; j++) {
  34.         b1 = b[i];
  35.         for(i = longth2; i > 0; i--) {
  36.             b1 = 2 * b1;
  37.         }
  38.         sum2 += b1;
  39.     }
  40.     */
  41.     for(j = 0; j < length2; j++) {
  42.         sum2 *= 2;
  43.         sum2 += b[j] - '0';
  44.     }
  45.     sum = sum1 + sum2;
  46.     char *c = malloc((length1 > length2 ? length1 : length2) + 2);
  47.     /*
  48.     for(i = 0; d >= 2; i++) {
  49.         c[i] = sum % 2 + '\0';
  50.         d = sum / 2;
  51.     }
  52.     */
  53.     char *p = c;
  54.     do {
  55.         *p++ = (sum % 2) + '0';
  56.         sum /= 2;
  57.     } while(sum);
  58.     *p = '\0';
  59.     reverse(c);
  60.     return c;
  61. }

  62. int main(void) {
  63.     char a[33], b[33];
  64.     scanf("%32s", a);
  65.     scanf("%32s", b);
  66.     char *c = addBinary(a, b);
  67.     puts(c);
  68.     free(c);
  69.     return 0;
  70. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-27 21:32:15 | 显示全部楼层

你好,再打扰一下,这道题是力扣上一道简单题 https://leetcode.cn/problems/add-binary/
我想问的是我这里哪里错了,可以帮我指出来一下吗,我知道你这样是对的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-27 21:39:41 | 显示全部楼层
addendum777 发表于 2022-9-27 21:32
你好,再打扰一下,这道题是力扣上一道简单题 https://leetcode.cn/problems/add-binary/
我想问的是我 ...

这是在做什么?我是没看懂

  1.     for(j = 0; j < length1; j++) {
  2.         a1 = a[i];
  3.         for(i = length1 - 1; i > 0; i--) {
  4.             a1 = 2 * a1;
  5.         }
  6.         sum1 += a1;
  7.     }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-27 23:13:36 | 显示全部楼层
人造人 发表于 2022-9-27 21:39
这是在做什么?我是没看懂

你好,这是我原来的代码,我是想将二进制的a转换为十进制存储在sum中,我不知道转为整型需要加‘0’;
现在已经改正了。 for(i=0;i<length1;i++)
    {   
            sum1=sum1*2;
            sum1+=a-'0';
    }
麻烦辛苦看一下我这个帖子一楼现在改过的代码,为什么在力扣这道题里还是报错。万分感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-28 00:11:57 | 显示全部楼层
addendum777 发表于 2022-9-27 23:13
你好,这是我原来的代码,我是想将二进制的a转换为十进制存储在sum中,我不知道转为整型需要加‘0’;
...

这里又在做什么?
  1.     for(i = 0; d >= 2; i++) {
  2.         c = sum % 2 + '\0';       // 这是什么?
  3.         d = sum / 2;
  4.     }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-29 10:32:51 | 显示全部楼层
人造人 发表于 2022-9-28 00:11
这里又在做什么?

这是把它们两个的和转换为二进制
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-29 12:27:52 | 显示全部楼层
addendum777 发表于 2022-9-29 10:32
这是把它们两个的和转换为二进制

这样可以转吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-29 12:29:28 | 显示全部楼层
addendum777 发表于 2022-9-29 10:32
这是把它们两个的和转换为二进制
  1.     char *c = malloc((length1 > length2 ? length1 : length2) + 2);
  2.     char *p = c;
  3.     do {
  4.         *p++ = (sum % 2) + '0';
  5.         sum /= 2;
  6.     } while(sum);
  7.     *p = '\0';
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-23 14:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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