鱼C论坛

 找回密码
 立即注册
查看: 2563|回复: 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;
        s=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-'0';
    }
        
    for(j=0;j<length2;j++)
    {
       sum2=sum2*2;
       sum2+=b-'0';
    }      
            sum=sum1+sum2;
             char *c=(char *)malloc(length1>length2?(length1+2):(length2+2));
    for(i=0;d>=2;i++)
    {
        c=sum%2+'\0';
        d=sum/2;
    }
    reverse(c);
    return c;
}


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

使用道具 举报

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

char * addBinary(char a[] , char b[])
{
        char s[4096] = {0} , x1 , x2 , * p                  ;
        int c , d , e , i , n                               ;
        for(c = 0 ; a[c] ; c ++)                            ;  // c = a 的长度
        for(d = 0 ; b[d] ; d ++)                            ;  // d = b 的长度
        for(i = e = 0 , n = (c < d) ? d : c ; i < n ; i ++) {  // 加法计算按长字符串长度安排循环
                s[i] = e                                    ;
                x1 = (i < c) ? a[c - i - 1] : '0'           ;  // 短字符串的不足部分一律按字符 '0' 充数
                x2 = (i < d) ? b[d - i - 1] : '0'           ;
                s[i] = s[i] + x1 - '0' + x2 - '0'           ;
                e = s[i] / 2                                ;  // 2 就是二进制的二
                s[i] %= 2                                   ;  // 2 就是二进制的二
        }
        if(e) s[n ++] = e                                   ;
        p = (char *) malloc(n + 1)                          ;
        for(i = 0 ; i < n ; i ++) p[i] = s[n - i - 1] + '0' ;
        p[n] = '\0'                                         ;
        return p                                            ;
}

int main(void)
{
        char a[3] = {"11"} , b[2] = {"1"} , * p             ;
        p = addBinary(a , b)                                ;
        printf("%s\n" , p)                                  ;
        free(p)                                             ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-27 20:19:40 | 显示全部楼层
本帖最后由 jhq999 于 2022-9-27 20:23 编辑
#include <stdio.h>
char* sum(char *s1,char *s2)
{
    int i=0,j=0,k=0;
    char* t=NULL;
    for(i=0;s1[i];i+=1);
    for(j=0;s2[j];j+=1);
    if(i<j)
    {
        t=s1,s1=s2,s2=t;
        i=i+j,j=i-j,i=i-j;
    }
    i+=1;
    for(k=i;k>0;k-=1)s1[k]=s1[k-1];
    s1[0]='0';
    for(k=i;j>=0;j-=1,i-=1)
    {
        s1[i]+=s2[j]-'0';
    }
    for(i=k;i>=0;i-=1)
    {
        if('2'==s1[i])s1[i]='0',s1[i-1]+=1;
        else if('3'==s1[i])s1[i]='1',s1[i-1]+=1;
    }
    for(i=0;'0'==s1[i];i+=1);
    return s1+i;
}
int main(void)
{
    char s1[256]={0},s2[256]={0};
    scanf("%s %s",s1,s2);
    printf("%s",sum(s1,s2));
    return 0;
}
110101 111010011
1000001000
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-27 20:21:15 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

我错了,我怕把你问烦了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-27 20:50:57 | 显示全部楼层
所以又开了一个问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

int main(void) {
    char a[33], b[33];
    scanf("%32s", a);
    scanf("%32s", b);
    char *c = addBinary(a, b);
    puts(c);
    free(c);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

这是在做什么?我是没看懂
    for(j = 0; j < length1; j++) {
        a1 = a[i];
        for(i = length1 - 1; i > 0; i--) {
            a1 = 2 * a1;
        }
        sum1 += a1;
    }
想知道小甲鱼最近在做啥?请访问 -> 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';
    }
麻烦辛苦看一下我这个帖子一楼现在改过的代码,为什么在力扣这道题里还是报错。万分感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

这里又在做什么?
    for(i = 0; d >= 2; i++) {
        c = sum % 2 + '\0';       // 这是什么?
        d = sum / 2;
    }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

这是把它们两个的和转换为二进制
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

发表于 2022-9-29 12:29:28 | 显示全部楼层
addendum777 发表于 2022-9-29 10:32
这是把它们两个的和转换为二进制
    char *c = malloc((length1 > length2 ? length1 : length2) + 2);
    char *p = c;
    do {
        *p++ = (sum % 2) + '0';
        sum /= 2;
    } while(sum);
    *p = '\0';
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-17 23:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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