對於我正在處理的程序,我需要執行「字符串數學」,在給定兩個字符串的情況下,我需要對字符串中的所有字符執行加或減操作以獲得最後結果。C - 釋放分配在循環中的內存
我在解決指針問題時遇到了問題,並且在理解如何在循環中使用指針時感覺我很困難。
目前我有:
int main() {
char * input = (char *)malloc(sizeof(char)*1024);
char * stringA = (char *)malloc(sizeof(char)*64);
char * stringB = (char *)malloc(sizeof(char)*64);
char * result;
char operand;
int matched = 0;
while(fgets(input, 1024, stdin) != NULL) {
matched = sscanf(input, "%s %s %c", stringA, stringB, &operand);
if (matched == 3) {
if (strlen(stringA) < strlen(stringB)) {
stringA = balanceLengths(stringA, stringB);
} else if (strlen(stringA) > strlen(stringB)) {
stringB = balanceLengths(stringB, stringA);
}
result = (char *)calloc(strlen(stringA)+2, sizeof(char));
result = performStringMath(result, stringA, stringB, operand);
printf("%s\n", result);
}
}
//printf("%s\n%s\n", stringA, stringB);
free(input);
free(stringA);
free(stringB);
return 0;
}
,我真的很努力理解我怎麼可以在循環的每一次迭代釋放的結果,因爲如果我是printf語句後添加一個免費的(結果)我從valgrind中得到幾個無效的讀寫錯誤,如果我在循環之前爲calloc分配內存,我也會出現類似的錯誤。
其他方法:
char * performStringMath(char *result, char *stringA, char *stringB, char operand) {
if (operand == '+') {
return performAddition(result, stringA, stringB);
} else if (operand == '-') {
return performSubtraction(stringA, stringB);
} else {
return 0;
}
}
char * balanceLengths(char *shorter, char *longer) {
int toAdd, i;
toAdd = (int)(strlen(longer) - strlen(shorter));
char *retString = (char *) malloc(sizeof(char) * strlen(longer)+ toAdd);
for (i = 0; i < toAdd; i++) {
retString[i] = '0';
retString[toAdd+i] = shorter[i];
}
return retString;
}
char * performSubtraction(char *stringA, char *stringB) {
return "";
}
char * performAddition(char *result, char *stringA, char *stringB) {
int carry, sum, i;
sum = 0;
carry = 0;
for (i = (int)strlen(stringA)-1; i >= 0; i--) {
sum = (stringA[i]-48) + (stringB[i]-48) + carry;
carry = 0;
if (sum >= 10) {
sum = sum-10;
carry = 1;
}
stringA[i] = (char)(sum+48);
}
if (carry != 0) {
result[0] = '1';
result = strcat(result, stringA);
} else {
result = stringA;
}
return result;
}
其實我已經通過更換
result = stringA;
到 結果=的strcpy(結果,stringA)解決了這個問題;
在功能執行添加。
歡迎來到Stack Overflow! [請參閱此討論,爲什麼不在'C'中投射'malloc()'和family的返回值。](http://stackoverflow.com/q/605845/2173917)。 –
將'free(result);'作爲'while'循環體的最後一個語句添加了什麼問題? –
你不「釋放指針」。你釋放它指向的對象! – Olaf