【发布时间】:2019-04-01 16:23:39
【问题描述】:
使用ansi c
#define STDC_VERSION 201112L
我是 c 新手,但我从 Here 获得领先
无论我尝试过何种方法,我都无法让sum 指针返回。
运行代码成功(创建正确的数字),addNumericStrings 函数中的 printf 有效,但 main 中的 printf 没有(不打印) .我假设由于之前的错误。我没有收到任何关于构建的警告。
输出
addNumericStrings.sum = 11234567889
主要
#include <stdio.h>
#include <stdlib.h>
#include "addViaStrings.h"
int main(void) {
char s1[] = "9999999999";
char s2[] = "1234567890";
char *sum = addNumericStrings(s1, s2);
printf("main.sum = %s\n", sum);
}
功能
#include <stdio.h>
#include <stdlib.h>
char addNumericStrings(char *s1, char *s2);
char leftPad(char *result, char *s, int maxlength);
int findMaxLength(char *s1, char *s2);
char addNumericStrings(char *s1, char *s2){
int maxlength = findMaxLength(s1, s2);
char addend1[maxlength];
char addend2[maxlength];
char *sum = (char *) malloc(sizeof(char) * (maxlength + 2) );
int a1, a2, total;
int carry = 0;
// char sum[(maxlength + 2)]; // +1 in case addition rolls over past maxlength
// Prepare the strings for manual addition
leftPad(addend1, s1, maxlength);
leftPad(addend2, s2, maxlength);
// Buffer sum with ascii zeros (#48), not 0, and not "\0"
for (int i = 0; i < (maxlength + 1); i++) { sum[i] = 48; }
sum[maxlength + 1] = 0;
// Run the manual addition
// Start adding individual ints from end (right side)
for (int i = maxlength - 1 ; i >= 0; i--) {
a1 = addend1[i] - '0'; // Convert to int
a2 = addend2[i] - '0'; // Convert to int
total = (a1 + a2 + carry);
carry = 0;
if ( total >= 10){
carry += 1;
total -= 10;
}
sum[i +1] = 48+total; // convert to ascii value for numbers (adding 48)
}
sum[0] = 48+carry; // add last carry to start of num always, even if 0
sum[maxlength + 1] = '\0';
printf("addNumericStrings.sum = %s\n", sum);
return sum;
}
char leftPad(char *result, char *s, int maxlength){
// Pads number to [000123456789]
( ...snip... )
}
int findMaxLength(char *s1, char *s2){
// Returns int value of the length of the longer between s1 and s2
int length1 = strlen(s1);
int length2 = strlen(s2);
int maxlength;
(length1 > length2) ? (maxlength = length1) : (maxlength = length2);
return maxlength;
}
【问题讨论】:
-
char addNumericStrings(char *s1, char *s2) {但您返回的是char *。 -
在几个不相关的注释上,首先请不要使用magic numbers。如果
48是指角色'0',那么say 就是这样。这也将使代码独立于 ASCII 编码(这不是唯一的编码)。此外,您的findMaxLength使用条件表达式的方式被许多人认为是“错误的”(包括我自己)。我建议类似maxlength = length1 > length2 ? length1 : length2;或完全跳过maxlength而只是return length1 > length2 ? length1 : length2; -
相信我,空终止符很重要。没有它,所有寻找结束的函数(包括你的
printf调用)都会越界寻找它,你将拥有undefined behavior。没有你添加它似乎可以工作,这纯粹是运气(有些人会认为你是不幸它有效)。 -
这个函数的返回类型是
char,但是你返回的是char *类型的数据。这就是问题所在。 -
你想返回一个
char*,所以addNumericStrings()的返回类型必须是char*,而不是char:char* addNumericStrings(char *s1, char *s2)。
标签: c pointers return-value ansi