我想减去两个具有数值的字符数组。我这样做是因为我想减去大数。当我编译这个程序时,它没有显示任何错误,但在执行时它崩溃了。 我尝试按照以下伪代码进行操作
foreach character(right2left)
difference=n1[i]-n2[i]//here suppose they are integers
if(difference<0)
{
n1[i-1]--;
difference+=10;
}
result[i]=diff;
为了清晰起见,我写了伪代码。
int subtract(char *n1,char *n2,int n1Len,int n2Len){
int diff;
int max=n1Len;
char* res = (char*)malloc (max+2);
memset(res, '0', max +1);
res[max] = '\0';
int i=n1Len - 1, j = n2Len - 1, k = max;
for (; i >= 0 && j >=0; --i, --j, --k) {
if(i >= 0 && j>=0)
{
diff=(n1[i]-'0') - (n2[i]-'0') ;
if(diff<0)
{
int temp=n1[i-1]-'0';
temp=temp-1;
n1[i-1]=temp+'0';
diff+=10;
}
res[i]=diff+'0';
}
else
res[i]=n1[i];
}
return atoi(res);
}
int main(void) {
int t=subtract("55","38",2,2);
printf("%d\n", t);
}
最佳答案
有一些明显的错误。希望这些能为您提供一些指导:
您将字符串文字传递给函数并尝试在函数中修改它们。那是无效的,很可能会导致段错误。而不是
int t=subtract("55","38",2,2);
也许你可以试试:
char a[] = "55";
char b[] = "38";
int t=subtract(a,b,strlen(a), strlen(b));
max
应为n1Len+1
以容纳res
字符数组中的终止NUL
字符。您可以在初始化时将其设置为0
而不是'0'
。res[max] = '\0';
当您访问超出绑定(bind)的元素时调用未定义的行为,摆脱它。因此,请改用memset(res,0,max)
。或者使用calloc
而不是 @pmg 建议的malloc
+memset
。在用 C 编写代码时,不要类型转换
malloc
或calloc
的返回值for (; i >= 0 || j >=0; --i, --j, --k)
实际上应该是for (; i > = 0 && j >=0; --i, --j, --k)
因为i
和j
都不应该是0
。您需要处理其中i!=j
的函数逻辑。diff=n1[i]-'0'+n2[i]-'0'
应该是diff=(n1[i]-'0') - (n2[i]-'0')
因为您要减去而不是添加数字res[i]=diff
不正确,因为您将整数结果设置为字符值。改为res[i]=diff+'0'
设置字符值
希望这能帮助您入门。
希望这对您有所帮助!
关于c - 使用 char 数组减去 2 个数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8524274/