วิธีผนวกอักขระเข้ากับสตริงตัวอักษรในภาษา C

ดังนั้นฉันจึงเห็นว่าบางคนไม่แนะนำให้ใช้ตัวอักษร String เพื่อสร้างอักขระใน C อย่างไรก็ตาม ฉันพบว่านี่เป็นวิธีที่มีประโยชน์ที่สุดและฉันมีชุดอักขระเป็น

char a[] = "456";

ฉันเข้าใจว่าหน่วยความจำได้รับการแก้ไขในประเภทข้อมูลนี้ อย่างไรก็ตาม ในงานมอบหมายของฉัน ฉันเชื่อว่าฉันต้องสามารถจัดสรรหน่วยความจำใหม่สำหรับค่าถ่านของฉันได้ เนื่องจากฉันกำลังบวกจำนวนเต็มที่แสดงเป็นสตริง ตัวอย่างเช่น:

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

ฉันใช้การเพิ่มแบบยาวเพื่อทำสิ่งนี้ให้สำเร็จ ฉันได้ลองทดลองใช้ฟังก์ชัน realloc แล้ว แต่ไม่ได้ผล ฉันจะต่อท้ายอักขระใหม่อย่างต่อเนื่องเข้ากับสตริงได้อย่างไร


person Hard_Programmer    schedule 10.02.2019    source แหล่งที่มา
comment
บางทีคุณอาจรวบรวมตัวอย่างที่ทำซ้ำได้เพียงเล็กน้อย เพื่อให้เราเห็นว่าคุณกำลังพยายามทำอะไร   -  person Retired Ninja    schedule 10.02.2019
comment
คุณสมบัติที่มีประโยชน์ของการบวกคือผลรวมของตัวเลขสองตัวมีหลักมากกว่าหนึ่งหลักมากกว่าผลรวมที่มากกว่าของทั้งสองตัว   -  person user3386109    schedule 10.02.2019
comment
หากคุณกำลังพยายามใช้การจัดสรรใหม่บนอาร์เรย์ ก็ไม่คาดว่าจะทำงานได้ คุณไม่สามารถจัดสรรอาร์เรย์ใหม่ได้   -  person William Pursell    schedule 10.02.2019
comment
comment
ดังที่ William ชี้ให้เห็น จริงๆ แล้ว ไม่มีการสร้างตัวอักษรสตริงใน char a[] = "456" ตัวอักษรสตริงเป็นตัวเริ่มต้นของอาร์เรย์ a   -  person stensal    schedule 10.02.2019
comment
ฟังก์ชัน realloc() จะทำงานหากใช้อย่างถูกต้อง การใช้อย่างถูกต้องไม่ใช่เรื่องยาก แม้ว่าจะใช้งานไม่ถูกต้องได้ง่ายมากก็ตาม คำอธิบายที่ดีกว่าคือฉันได้ลองใช้ฟังก์ชัน realloc() แล้ว แต่ไม่สามารถหาวิธีใช้งานได้อย่างถูกต้อง   -  person Jonathan Leffler    schedule 10.02.2019
comment
@JonathanLeffler ฉันเชื่อว่าเขาไม่สามารถใช้ realloc ได้หากเขายืนยันที่จะใช้ char a[] = "456"; เพื่อประกาศที่เก็บข้อมูล ความเข้าใจของฉันคือ realloc สามารถจัดสรรพื้นที่เก็บข้อมูลที่จัดสรรบนฮีปใหม่เท่านั้น ช่วยแก้ให้ด้วยนะถ้าฉันผิด.   -  person stensal    schedule 10.02.2019
comment
@stensal - สิทธิ์ของคุณที่หนึ่งในขั้นตอนคือเพื่อให้แน่ใจว่าข้อมูลได้รับการจัดสรร วิธีง่ายๆ วิธีหนึ่งในการใช้ realloc() ในทางที่ผิดคือการลองและ realloc() หน่วยความจำที่ไม่ได้จัดสรรไว้ก่อนหน้านี้ วิธีแก้ปัญหาที่ใช้ realloc() และเพื่อนๆ จะต้องมีการแก้ไขโค้ดอย่างระมัดระวัง อย่างไรก็ตามก็สามารถทำได้ realloc()ไม่เสียหาย   -  person Jonathan Leffler    schedule 10.02.2019


คำตอบ (2)


สำหรับงานมอบหมายของคุณ คุณต้องกำหนดอาร์เรย์ปลายทางโดยมีพื้นที่เพียงพอสำหรับเก็บผลลัพธ์ ซึ่งง่ายต่อการพิจารณาสำหรับการบวก: มันคือความยาวของอาร์กิวเมนต์ที่ยาวที่สุดบวกหนึ่งอักขระสำหรับตัวเลขพิเศษที่เป็นไปได้ บวกหนึ่งอักขระสำหรับจุดสิ้นสุดที่เป็นโมฆะ .

คุณสามารถจัดสรรอาร์เรย์นี้ด้วย 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;
}
person chqrlie    schedule 10.02.2019

วิธีที่ฉันเห็นคือพิมพ์ว่า:

char a[] = "456";

คุณเริ่มต้นอาร์เรย์อักขระขนาด 4 (3 ตัวอักษร +'\0') การจัดเก็บสิ่งใด ๆ อีกต่อไปในอาร์เรย์เดียวกันอาจทำให้เกิดพฤติกรรมที่ไม่ได้กำหนดไว้และต้องหลีกเลี่ยง เรื่องสั้น: คุณสามารถแก้ไขค่าของอาร์เรย์นี้ได้ ตราบใดที่ขนาดของมันไม่เปลี่ยนแปลง คุณสามารถเริ่มต้นอาร์เรย์ได้ดังนี้:

char a[100] = "456";

เพื่อเว้นช่องว่างเพิ่มเติมสำหรับการเพิ่มสตริงที่เป็นไปได้ แต่ก็แค่นั้นแหละ เนื่องจากขนาดของอาร์เรย์เป็นที่รู้จักในการคอมไพล์ และไม่เคยเปลี่ยนแปลง โปรดทราบว่าสิ่งนี้ จะไม่ ทำงาน:

char * a = "456";

เป็นสตริงลิเทอรัลแบบอ่านอย่างเดียวซึ่งไม่สามารถแก้ไขหรือจัดสรรใหม่ได้

PS: ฉันเป็นมือใหม่ โปรดแก้ไขฉันหากฉันผิด!

person Duck Ling    schedule 10.02.2019