2017-05-12 5 views
0

Das Problem ist, dass, obwohl ich den Zeiger bei jedem Aufruf der Addnums-Funktion am Ende erhöht das Array addednums enthält nur ein Zeichen, das letzte, das berechnet wurde. Warum passiert dies?Hinzufügen von Zahlen als Zeichenfolgen in C

#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; 
} 
+1

Funktionsargument 'char * res' ist eine * Kopie * der übergebenen Variablen, die unverändert bleibt. –

+0

Allergisch auf den Eindruck? –

Antwort

1

Der Zeiger, die Sie ist die lokalen Zeiger in addnums() zu erhöhen versuchen, die eine Kopie des Zeigers in addHugeNums() ist, die jeweils an der gleichen Stelle zeigt.

Versuchen Sie, den Zeiger in addHugeNums() zu erhöhen, bevor Sie eine Kopie davon an addnums() senden. Zum Beispiel kann versuchen Sie Folgendes:

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; 
} 

Zur weiteren Klärung, Ihr Code wie angeboten hat im Anschluss an die während jeder Iteration: Es fordert die Funktion addnums() und eine Kopie des Zeigers res als Paramater gesendet. Innerhalb von addnums() inkrementieren Sie die Kopie von res (die ursprüngliche res unverändert lassen) und wenn Sie diesen Funktionsaufruf dann beenden, existiert diese Kopie nicht mehr.

Bei der nächsten Iteration führen Sie genau das gleiche durch.

+0

ja, ich tat das, aber es ist immernoch nicht arbeite nicht. Wenn ich versuche, das addednums-Array zu drucken, hat es nur ein Element, das letzte, das in der addHugeNums-Funktion berechnet wurde – ADR

+0

@ADR Ich habe meine Antwort bearbeitet, bitte versuchen Sie es jetzt und lassen Sie mich wissen, wenn Sie noch ein Problem haben. – RoaaGharra

+0

es funktioniert jetzt gut. Vielen Dank :) – ADR

2

Sie Erhöhen Sie die lokale Kopie des Zeigers, aber das zurück nicht vorbei. Sie benötigen res als char** und übergeben die Adresse des äußeren Zeigers, damit das Inkrement außerhalb Ihrer addnums-Funktion sichtbar ist.

+0

Ich stoppte den Zeiger innerhalb der Addnums-Funktion zu erhöhen. es ändert nur die Kopie des Zeigerwerts in die berechnete und inkrementierte den Zeiger in addHugenNumbers, wenn len1! = - 1 && len2! = - 1, aber es speichert nur das zuletzt berechnete Element – ADR

Verwandte Themen