c - 计算后从字符串中删除 '0'

标签 c

我试图在两个字符串中进行乘法; 完成后,代码向我显示了答案,其中包含来自 calloc 的所有“0”。

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

typedef char* verylong;

verylong input_long(void) {
    int len = sizeof(char),size=0,c,i=0;
    verylong num = malloc(len);
    char ch;
    size = len;
    if (num != NULL) {
        while ((c = getchar()) != '\n' && c != EOF) {
              ch = (char)c;
             if (isdigit(ch))
                num[i++] = ch;
             else
                 return NULL;
             if (i == size) {
                size = i + len;
                if ((num = realloc(num, size)) == NULL)
                   return NULL;
            }
        }
   }
   else
       return NULL;
   num[i] = '\0';
   return num;

}

verylong_multiply(verylong num1, verylong num2) {
int long1 = strlen(num1), long2 = strlen(num2);
verylong ret = calloc(long1 + long2 +1, sizeof(char));
_strrev(num1);
_strrev(num2);
int carry = 0;

for (int i = 0; i < long2; i++) {
    int dig2 = num2[i]-'0';
    carry = 0;
    for (int j = 0; j < long1; j++) {
        int dig1 = num1[j]-'0';
        int temp = ret[i+j]-'0';
        int cur = dig1 * dig2 + temp + carry;
        ret[i+j] = cur % 10+'0';
        carry = cur / 10;
    }
    if (carry>0)
        ret[i+long1] = carry +'0';
}

_strrev(ret);
return ret;
}
void main() {
char* a = input_long();
char* b = input_long();
printf(multiply(a, b));
}

这是整个代码,输出似乎一直给我两个字符串 (10*10) 580 的答案,它不断添加乘法 if '0' (ascii 中的 48)。

最佳答案

除了算法和数据结构的总体设计之外,还有几个问题(一个将大小与数字数组一起存储的结构,从最低有效位开始,可以简化所有计算)。

verylong_multiply(verylong num1, verylong num2) {
if (strlen(num1) == 0 || strlen(num2) == 0) return '0';

这里至少存在复制粘贴错误,要么函数是verylongmultiply(...),要么缺少返回类型。另外,如果我们假设(我们不应该)verylongchar * 的 typedef,那么 return '0'; 就是简单的错误的。 '0'char,而不是 char *

在整个代码段中,'0''\0'NULL 之间似乎存在混淆。

这一行

verylong ret = calloc(sizeof(char) , long1 + long2 + 1);
//                    ^^^^^^^^^^^    ^^^^^^^^^^^^^^^^^   Those should be switched

将分配数组并用填充它,而不是'0'

如果你想用'0'填充它(除了空终止符),你可以使用

memset(ret, '0', long1 + long2);

这样,在稍后的代码中,您也可以更改此行

int temp = ret[i+j];                   //  -->    int temp = ret[i+j] - '0';
int cur = dig1 * dig2 + temp + carry;
ret[i+j] = cur % 10 + '0';

Thrn,在反转字符串并返回它之前,您可以将最终的最后一个 '0' 转换为 '\0',以避免出现 >10 * 123 = 01230 而不是 1230

请注意,所选的数据结构会强制您在每次调用此函数时反转表示数字的字符串并计算它们的长度,并且您还应该将它们反转回原始状态,如果您计划再次使用它们。

关于c - 计算后从字符串中删除 '0',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59803166/

相关文章:

C编译静态局部变量和静态全局变量的区别

c - 使用二维数组在 C 中存储字符串

c - 共享对象列表未在 Linux 内核中的打开文件列表下列出

c - 这个表达式 : void* (*fct)(void*(*)(void*), void*) 是什么意思?

java - 从 C 程序调用 Java

c - 字符串中的二进制位模式转换为 C 中的十六进制数

c - 使用 GCC 强制从链接的静态库中导出特定的可见符号(同时排除其他符号)

C追加到头文件中的数组

c - 尝试使用文件 i/o 读写来查找两个文件不同的字节位置

c++ - 比较从 C 中的套接字接收的字符串数据