Как добавить символ в строковый литерал в C - PullRequest
0 голосов
/ 10 февраля 2019

Итак, я видел, что некоторые люди не рекомендуют использовать строковые литералы для создания символа в 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, но она не сработала.Как бы я постоянно добавлять новые символы в строку?

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

Для вашего назначения вы должны определить целевой массив с достаточным пространством для хранения результата, который для сложения легко определить: это длина самого длинного аргумента плюс один символ для возможной дополнительной цифры плюс один символ длянулевой терминатор.

Вы можете выделить этот массив с помощью 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 голосов
/ 10 февраля 2019

так что я вижу это, набрав:

char a[] = "456";

вы инициализируете массив символов размером 4 (3 символа + '\ 0').хранение чего-либо более в одном и том же массиве может вызвать неопределенное поведение, и его следует избегать.Короче говоря: вы можете изменить значение этого массива, если его размер не меняется. Вы можете инициализировать массив следующим образом:

char a[100] = "456";

, чтобы оставитьнекоторое дополнительное пространство для любых возможных дополнений к строке, но это все, так как размер массива известен при компиляции и никогда не изменяется.Также обратите внимание, что это не будет работать:

char * a = "456";

это строковый литерал только для чтения, который не может быть изменен или переопределен.

PS: Яновичок, поправьте меня, если я ошибаюсь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...