所以我看到有些人不建议使用String文字在C中创建字符。但是,我发现这是最有用的方法,并且我将字符集设置为
char a[] = "456";
我知道该数据类型的内存是固定的。但是,在我的作业中,我相信我需要能够为char值重新分配内存,因为我要添加表示为字符串的整数。例如:
char b[] = "500";
char c[] = "501";
//add function for adding b and c. have a char d[] equal to "1000".
我正在使用很长时间来完成此操作。我尝试使用realloc函数进行尝试,但是没有用。如何将新字符连续追加到字符串上?
答案 0 :(得分:1)
对于您的分配,您必须定义一个目标数组,该数组必须有足够的空间来容纳结果,要轻松确定该结果,它是最长参数的长度加上一个可能的额外数字的字符加上一个用于空终止符。
您可以使用malloc()
分配此数组并返回一个指针。
这里是一个例子:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *bigadd(const char *a, const char *b) {
size_t alen = strlen(a);
size_t blen = strlen(b);
size_t clen = (alen > blen) ? alen : blen;
size_t mlen = (alen > blen) ? blen : alen;
char *c = malloc(clen + 2);
if (c != NULL) {
size_t i;
int carry = 0;
c[clen] = '\0';
for (i = 1; i <= mlen; i++) {
carry += a[alen - i] - '0' + b[blen - i] - '0';
c[clen - i] = '0' + carry % 10;
carry /= 10;
}
for (; i <= alen; i++) {
carry += a[alen - i] - '0';
c[clen - i] = '0' + carry % 10;
carry /= 10;
}
for (; i <= blen; i++) {
carry += b[blen - i] - '0';
c[clen - i] = '0' + carry % 10;
carry /= 10;
}
if (carry) {
memmove(c + 1, c, clen + 1);
c[0] = (char)('0' + carry);
}
}
return c;
}
int main(int argc, char *argv[]) {
const char *a = argc > 1 ? argv[1] : "123456890123456890123456890";
const char *b = argc > 2 ? argv[2] : "2035864230956204598237409822324";
char *c = bigadd(a, b);
printf("%s + %s = %s\n", a, b, c);
free(c);
return 0;
}
答案 1 :(得分:0)
所以我看到它的方式是输入:
char a[] = "456";
您初始化一个大小为4(3个字符+'\ 0')的字符数组。将更多内容存储在同一数组中可能导致未定义的行为,必须避免。长话短说:您可以修改此数组的值,只要它的大小不变即可。您可以像这样初始化数组:
char a[100] = "456";
为字符串的任何可能的添加留出一些额外的空间,但是就这样,因为在编译时知道数组的大小,并且数组的大小永远不会改变。 还请注意,此不会起作用:
char * a = "456";
这是一个只读的字符串文字,无法修改或重新分配。
PS:我是新手,如果我输入错了,请纠正我!