因此,我看到有些人不建议在C中使用字符串文字来创建字符,但是,我发现这是最有用的方法,我的char设置为
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函数,但它没有起作用。如何不断地将新字符添加到字符串中?
发布于 2019-02-10 11:50:20
对于赋值,您必须定义一个具有足够空间以容纳结果的目标数组,对于添加而言,这很容易确定:它是最长参数的长度,加上一个可能的额外数字字符加上一个空终止符的字符。
您可以使用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;
}发布于 2019-02-10 10:29:19
所以我的看法是通过键入:
char a[] = "456";初始化大小为4的字符数组(3个字符+'\0')。在同一数组中存储更长时间的任何内容都可能导致未定义的行为,因此必须避免。长话短说:您可以修改这个数组的值,只要它的大小不改变。,您可以像这样初始化一个数组:
char a[100] = "456";为字符串的任何可能的添加留出一些额外的空间,但仅此而已,因为数组的大小在编译时是已知的,并且永远不会改变。还请注意,这个不会工作:
char * a = "456";这是一个只读字符串文字,不能修改或重新分配。
PS:我是新手,如果我错了,请纠正我!
https://stackoverflow.com/questions/54613764
复制相似问题