如何附加一个字符的字符串使用C字面

问题描述 投票:1回答:2

所以,我看到有些人不推荐使用字符串字面创造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函数试验,但没有奏效。我怎么会不断新角色追加到一个字符串?

c char append
2个回答
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;
}

0
投票

所以我看到它的方式是通过键入:

char a[] = "456";

你初始化大小为4的字符数组(3个字符+“\ 0”)。同一阵列中存储更长任何可能导致未定义的行为,必须加以避免。长话短说:你可以修改此数组的值,只要它的大小不会改变。您可以初始化一个这样的数组:

char a[100] = "456";

留下任何可能增加的字符串一些额外的空间,但仅此而已,因为数组的大小在编译已知的,并且不改变过。还请注意,这是行不通的:

char * a = "456";

这是一个只读的字符串文字不能被修改或realloced。

PS:我是新手,请纠正我,如果我错了!

© www.soinside.com 2019 - 2024. All rights reserved.