在C中以字符串形式添加数字

在C中以字符串形式添加数字,c,string,pointers,pointer-arithmetic,C,String,Pointers,Pointer Arithmetic,问题是,尽管每次调用addnums函数时我都会增加指针,但addednums数组只包含一个字符,即最后计算的一个字符。为什么会这样 #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> /* run this program using the console pauser or add your own getch,system("pause"

问题是,尽管每次调用addnums函数时我都会增加指针,但addednums数组只包含一个字符,即最后计算的一个字符。为什么会这样

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

/* run this program using the console pauser or add your own getch,system("pause") or input loop */

int addHugeNumbers(char *a1, char *a2,char *res) ;
int checkifnum(char *c1) ;
void addnums(char *a1, char *a2, char *res, int *ip) ;

int main(int argc, char *argv[]) {

char firstnum[255],secondnum[255],addednum[255] = {0};

/*Óôçí ðåñßðôùóç ðïõ ï ÷ñÞóôçò äþóåé ôÝôïéïõò áñéèìïýò þóôå íá ÷ñåéáóôåß êáé    256 bit ôüôå åìöáíßæåé
ôïí ìÝãéóôï áñéèìü ðïõ ìðïñåß ìå 255 bit*/

printf("Give the first number : "); scanf("%s",&firstnum);
printf("Give the second number : "); scanf("%s",&secondnum);
printf("%s %s\n", firstnum,secondnum) ;
printf("%d",addHugeNumbers(firstnum,secondnum,addednum)) ;
return 0;
}

int addHugeNumbers(char *a1, char *a2,char *res){
int carry,len1,len2,*ip,i;
ip = &carry ;
if ((checkifnum(a1) == 0)||(checkifnum(a2) == 0)) return 0;
len1 = strlen(a1) - 1;
len2 = strlen(a2) - 1;
a1 += strlen(a1) - 1;
a2 += strlen(a2) - 1;
//printf("%c %c\n",*a1,*a2) ;
do{
    addnums(a1,a2,res,ip) ;
    len1--;len2--;   
    if (len1!=-1 && len2!=-1) a1--,a2--;
}while(len1>-1 && len2>-1) ;
printf("%s\n",res) ;
return 1;
}

void addnums(char *a1, char *a2, char *res, int *ip){
*res++ = (char)((*a1 - '0' + *a2 - '0' + *ip) % 10 + '0');
*ip = (*a1 - '0' + *a2 - '0' + *ip) / 10;
}

int checkifnum(char *c1){
while (*c1) {
    if (isdigit(*c1++) == 0) return 0;
}
return 1;   
}
#包括
#包括
#包括
#包括
/*使用控制台暂停器运行此程序,或添加您自己的getch、system(“暂停”)或输入循环*/
int addHugeNumbers(char*a1、char*a2、char*res);
int checkifnum(char*c1);
void addnums(char*a1、char*a2、char*res、int*ip);
int main(int argc,char*argv[]){
char firstnum[255],secondnum[255],addednum[255]={0};
/*Óùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùù
255位*/
printf(“给出第一个数字:”;scanf(“%s”和&firstnum);
printf(“给出第二个数字:”;scanf(“%s”、&secondnum);
printf(“%s%s\n”,firstnum,secondnum);
printf(“%d”,addHugeNumbers(firstnum,secondnum,addednum));
返回0;
}
int addHugeNumbers(char*a1、char*a2、char*res){
整数进位,len1,len2,*ip,i;
ip=&进位;
if((checkifnum(a1)==0)| |(checkifnum(a2)==0))返回0;
len1=strlen(a1)-1;
len2=strlen(a2)-1;
a1+=strlen(a1)-1;
a2+=strlen(a2)-1;
//printf(“%c%c\n”、*a1、*a2);
做{
地址(a1、a2、res、ip);
透镜1-;透镜2-;
如果(len1!=-1&&len2!=-1)a1--,a2--;
}while(len1>-1和&len2>-1);
printf(“%s\n”,res);
返回1;
}
void addnums(char*a1、char*a2、char*res、int*ip){
*res++=(char)((*a1-'0'+*a2-'0'+*ip)%10+'0');
*ip=(*a1-'0'+*a2-'0'+*ip)/10;
}
int checkifnum(char*c1){
而(*c1){
if(isdigit(*c1++)==0)返回0;
}
返回1;
}

您正在递增指针的本地副本,但没有将其传回。您需要将
res
作为
char**
并传递外部指针的地址,以使增量在
addnums
函数外部可见。

您正在递增指针的本地副本,但没有将其传回。您需要将
res
作为
char**
并传递外部指针的地址,以便增量在
addnums
函数外部可见。

您尝试增量的指针是
addnums()中的本地指针。
它是
addHugeNums()中指针的副本
每次都指向相同的位置

在将指针的副本发送到
addnums()
之前,请尝试在
addHugeNums()中递增指针。例如,您可以尝试以下操作:

int addHugeNumbers(char *a1, char *a2,char *res){
int carry = 0;
int len1,len2,*ip;
ip = &carry ;
if ((checkifnum(a1) == 0)||(checkifnum(a2) == 0)) return 0;
len1 = strlen(a1) - 1;
len2 = strlen(a2) - 1;
a1 += strlen(a1) - 1;
a2 += strlen(a2) - 1;
//printf("%c %c\n",*a1,*a2) ;
char* tmp = res;
do{
    addnums(a1,a2,tmp,ip) ;
    tmp++;
    len1--;len2--;   
    if (len1!=-1 && len2!=-1) a1--,a2--;
}while(len1>-1 && len2>-1) ;
printf("%s\n",res) ;
return 1;
}
为了进一步澄清,您的代码在每次迭代中都按原样执行以下操作: 它调用函数
addnums()
,并将指针
res
的副本作为参数发送。在
addnums()
中,增加
res
的副本(保持原始
res
不变),然后在退出该函数时调用该副本不再存在


在下一次迭代中,您将执行完全相同的操作。

您试图递增的指针是
addnums()
中的本地指针,它是
addHugeNums()
中指针的副本,每次指向相同的位置

在将指针的副本发送到
addnums()
之前,请尝试在
addHugeNums()中递增指针。例如,您可以尝试以下操作:

int addHugeNumbers(char *a1, char *a2,char *res){
int carry = 0;
int len1,len2,*ip;
ip = &carry ;
if ((checkifnum(a1) == 0)||(checkifnum(a2) == 0)) return 0;
len1 = strlen(a1) - 1;
len2 = strlen(a2) - 1;
a1 += strlen(a1) - 1;
a2 += strlen(a2) - 1;
//printf("%c %c\n",*a1,*a2) ;
char* tmp = res;
do{
    addnums(a1,a2,tmp,ip) ;
    tmp++;
    len1--;len2--;   
    if (len1!=-1 && len2!=-1) a1--,a2--;
}while(len1>-1 && len2>-1) ;
printf("%s\n",res) ;
return 1;
}
为了进一步澄清,您的代码在每次迭代中都按原样执行以下操作: 它调用函数
addnums()
,并将指针
res
的副本作为参数发送。在
addnums()
中,增加
res
的副本(保持原始
res
不变),然后在退出该函数时调用该副本不再存在


在下一次迭代中,您将执行完全相同的操作。

函数参数
char*res
是传递的变量的副本,它保持不变。对缩进过敏?函数参数
char*res
是传递的变量的副本,对缩进过敏?我停止在addnums函数中增加指针。它所做的只是将指针值的副本更改为计算值,并在addHugenNumbers if len1中增加指针=-1和2=-1但它仍然只保存最后计算的元素i停止在addnums函数中增加指针。它所做的只是将指针值的副本更改为计算值,并在addHugenNumbers if len1中增加指针=-1和2=-1但它仍然只保存最后计算的元素是的,我这样做了,但它仍然不工作。当我试图打印addednums数组时,它只有一个元素,即AddHugEnum中计算的最后一个元素function@ADR我编辑了我的答案,请立即尝试,如果您还有问题,请告诉我。
int carry
-->
int carry=0
这是一个整数,因此dafault值为0@ADR事实上,蓝精灵是对的。我编辑了我的答案。在C语言中,未初始化的整数有一个未定义的值。是的,我这样做了,但它仍然不起作用。当我试图打印addednums数组时,它只有一个元素,即AddHugEnum中计算的最后一个元素function@ADR我编辑了我的答案,请立即尝试,如果您还有问题,请告诉我。
int carry
-->
int carry=0
这是一个整数,因此dafault值为0@ADR事实上,蓝精灵是对的。我编辑了我的答案。在C语言中,未初始化的整数有一个未定义的值。