为什么当我使用减法或使用加法时,结果打印不正确,但最终结果需要超过8个字符

问题描述 投票:0回答:1

据我所知,加法、2 的补码和减法函数按照我的预期工作,这只是打印结果时的一个错误,我认为这与变量类型或字符串长度(其中存在额外空格)有关给出了垃圾值,但我不知道如何修复它

这是我的代码:

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

int main() {
    int parse(char*);
    void get2Complement(char *);
    void Add(char *num1, char *num2, char *result);
    char binary1[100], binary2[100], operator[1], binary3[100];
    char result[8];
    char binaryOne[] = {'0', '0', '0', '0', '0', '0', '0', '1'};


    printf("Enter first binary number: ");
    scanf("%s", binary1);

    printf("Enter operator (+ or -): ");
    scanf(" %c", operator);

    printf("Enter second binary number: ");
    scanf("%s", binary2);
    printf("ORIGINAL NUM2:  %s\n\n\n", binary2);


    if(!parse(binary1)){
        printf("Number 1 Needs to be in Binary!\n");
        return 1;
    }


    if (operator[0] != '+' && operator[0] != '-') {
        printf("Operator must be + or -\n");
        return 1;
    }

    if(!parse(binary2)){
        printf("Number 2 Needs to be in Binary!\n");
        return 1;
    }

    if (operator[0] == '-') {
        get2Complement(binary2);
        Add(binary2, binaryOne, binary3);
    }else {

        Add(binary1, binary2, result);
    }

//printing at the end

    printf("%s", binary1);
    printf("%c", operator[0]);
    printf("%s=", binary2);
    //printf("\nRESULT:  ");
    for(int i = 0; i<strlen(result); i++){
        printf("%c", result[i]);
    }
    printf("\nUSING PERCENT S:  %s", result);

    return 0;

}


int parse(char* binary){
    //printf("PARSE FUNCTION STARTS\n");
    for (int i = 0; i < strlen(binary); i++) {
        if (binary[i] != '0' && binary[i] != '1') {
            return 0;
        }
    }
    return 1;
}

void get2Complement(char* complement) {
    for (int i = 0; i < strlen(complement); i++) {
        if (complement[i] == '0') {
            complement[i] = '1';
            printf("%c", complement[i]);
            continue;
        }else{
            if(complement[i] == '1'){
                complement[i] = '0';
                printf("%c", complement[i]);
                continue;
            }
        }

    }

}

void Add(char *num1, char *num2, char *result){
    char carry[] = {'0', '0','0','0','0','0','0','0'};
    unsigned long long x = strlen(num1);
//    printf("NUM1LENGTH %llu\n", x);
    unsigned long long y = strlen(num2);
//    printf("NUM2LENGTH %llu", y);
    unsigned long long p = 0;
     if(x<=y){
         p = y;
     }
     if(x>y){
         p = x;
     }
    for(int i = 7; i>-1; i--){

        if(num1[i] == '1' && num2[i] == '0' && carry[i] == '0'){
            result[i] = '1';
            carry[i-1] = '0';
            continue;
        }

        if(num1[i] == '1' && num2[i] == '0' && carry[i] == '0'){
            result[i] = '1';
            carry[i-1] = '0';
            continue;
        }

        if(num1[i] == '0' && num2[i] == '1' && carry[i] == '0'){
            result[i] = '1';
            carry[i-1] = '0';
            continue;
        }

        if(num1[i] == '0' && num2[i] == '0' && carry[i] == '1'){
            result[i] = '1';
            carry[i-1] = '0';
            continue;
        }

        if(num1[i] == '1' && num2[i] == '1' && carry[i] == '0'){
            result[i] = '0';
            carry[i-1] = '1';
            continue;
        }

        if(num1[i] == '0' && num2[i] == '1' && carry[i] == '1'){
            result[i] = '0';
            carry[i-1] = '1';
            continue;
        }

        if(num1[i] == '1' && num2[i] == '0' && carry[i] == '1'){
                result[i] = '0';
                carry[i-1] = '1';
            continue;
        }

        if(num1[i] == '0' && num2[i] == '0' && carry[i] =='0'){
                result[i] = '0';
                carry[i-1] = '0';
            continue;
        }

        if(num1[i] == '1' && num2[i] == '1' && carry[i] == '1'){
            result[i] = '1';
            carry[i-1] = '1';
            continue;
        }
    }




}

c binary addition subtraction
1个回答
0
投票

您的代码存在很多问题,但我认为您主要错过了以下两点:

  1. 您的

    get2Complement(char* complement)
    函数会修改参数,但您在应用此操作后正在打印输入。要解决此问题,只需在执行操作之前移动那些
    printf
    线即可。

  2. 在减法中,您计算了

    binary2
    的补码,但忘记将
    binary1
    的补码相加。您可以通过在减法部分添加binary3和binary1 ->
    Add(binary1, binary3, result);
    来解决这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.