Cara Menambahkan karakter ke string literal di C

Jadi saya telah melihat bahwa beberapa orang tidak merekomendasikan penggunaan literal String untuk membuat char di C. Namun, menurut saya ini adalah metode yang paling berguna dan saya memiliki char yang ditetapkan sebagai

char a[] = "456";

Saya memahami bahwa memori diperbaiki pada tipe data ini. Namun, dalam tugas saya, saya yakin bahwa saya harus dapat mengalokasikan kembali memori untuk nilai char saya karena saya menambahkan bilangan bulat yang direpresentasikan sebagai string. Misalnya:

char b[] = "500";
char c[] = "501";
//add function for adding b and c. have a char d[] equal to "1000". 

Saya menggunakan penambahan panjang untuk mencapai ini. Saya telah mencoba bereksperimen dengan fungsi realloc tetapi tidak berhasil. Bagaimana saya terus menambahkan karakter baru ke dalam string?


person Hard_Programmer    schedule 10.02.2019    source sumber
comment
Mungkin Anda dapat membuat contoh minimal yang dapat direproduksi sehingga kami dapat melihat apa yang Anda coba lakukan.   -  person Retired Ninja    schedule 10.02.2019
comment
Sifat penjumlahan yang berguna adalah jumlah dua bilangan mempunyai paling banyak satu digit lebih banyak daripada bilangan terbesar kedua penjumlahannya.   -  person user3386109    schedule 10.02.2019
comment
Jika Anda mencoba menggunakan realoc pada sebuah array, hal itu diperkirakan tidak akan berhasil. Anda tidak dapat mengalokasikan ulang array.   -  person William Pursell    schedule 10.02.2019
comment
stackoverflow.com/questions/10279718/append- char-to-string-in-c   -  person Islam Mustafa    schedule 10.02.2019
comment
Seperti yang ditunjukkan William, sebenarnya, tidak ada string literal yang dibuat di char a[] = "456", string literal adalah inisialisasi array a.   -  person stensal    schedule 10.02.2019
comment
Fungsi realloc() berfungsi jika digunakan dengan benar; tidak terlalu sulit untuk menggunakannya dengan benar, meskipun sangat mudah untuk menggunakannya secara tidak benar. Penjelasan yang lebih baik adalah saya telah mencoba bereksperimen dengan fungsi realloc() tetapi tidak dapat menemukan cara menggunakannya dengan benar.   -  person Jonathan Leffler    schedule 10.02.2019
comment
@JonathanLeffler, saya yakin dia tidak dapat menggunakan realloc jika dia bersikeras menggunakan char a[] = "456"; untuk mendeklarasikan penyimpanan. Pemahaman saya adalah realloc hanya dapat mengalokasikan kembali penyimpanan yang dialokasikan di heap. Koreksi saya jika saya salah.   -  person stensal    schedule 10.02.2019
comment
@stensal - Anda berhak bahwa salah satu langkahnya adalah memastikan data dialokasikan; salah satu cara mudah untuk menyalahgunakan realloc() adalah dengan mencoba dan realloc() memori yang sebelumnya tidak dialokasikan. Solusi menggunakan realloc() dan teman-teman memerlukan pengerjaan ulang kode yang cermat. Namun demikian, hal itu bisa dilakukan; realloc() tidak rusak.   -  person Jonathan Leffler    schedule 10.02.2019


Jawaban (2)


Untuk tugas Anda, Anda harus menentukan array tujuan dengan ruang yang cukup untuk menampung hasilnya, yang mudah untuk ditentukan sebagai tambahan: ini adalah panjang argumen terpanjang ditambah satu karakter untuk kemungkinan digit tambahan ditambah satu karakter untuk terminator nol .

Anda dapat mengalokasikan array ini dengan malloc() dan mengembalikan sebuah pointer.

Berikut ini contohnya:

#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;
}
person chqrlie    schedule 10.02.2019

jadi cara saya melihatnya adalah dengan mengetik:

char a[] = "456";

Anda menginisialisasi array karakter berukuran 4 (3 karakter +'\0'). menyimpan sesuatu yang lebih lama dalam larik yang sama dapat menyebabkan perilaku tidak terdefinisi dan harus dihindari. singkat cerita: Anda dapat mengubah nilai array ini, selama ukurannya tidak berubah. Anda dapat menginisialisasi array seperti ini:

char a[100] = "456";

untuk menyisakan ruang ekstra untuk kemungkinan penambahan string, tapi itu saja, karena ukuran array diketahui saat kompilasi, dan tidak pernah berubah. harap perhatikan juga bahwa ini tidak akan berfungsi:

char * a = "456";

ini adalah string literal read-only yang tidak dapat dimodifikasi atau dialokasikan kembali.

PS: Saya pemula, mohon koreksi jika salah!

person Duck Ling    schedule 10.02.2019