Переполнение строки

Проблема в том что компилятор на 48 и 51 строчке жалуется на переполнение строки , можете обьяснить в чем причина , я не совсем понимаю

#include <iostream>
#include <string>
#include <iomanip>
#include <Windows.h>
using namespace std;
void Numbers(char A[],char B[], char C[])// перевод из символов в числа
{
    for (int i = 0; i < 300; i++)
    {
        A[i] -= '0';
        B[i] -= '0';
        C[i] = 0;
    }
}
void Symbols(char A[], char B[], char C[]) // перевод из чисел в символы
{
    for (int i = 0; i < 300; i++)
    {
        A[i] += '0';
        B[i] += '0';
        C[i] += '0';
    }
}
void Summ(char A[], char B[], char C[])
{
    for (int i = 0; i < 300; i++)
    {
        C[i] += (A[i] + B[i]) % 10;
        C[i + 1] += (A[i] + B[i]) / 10;
    }
}
int main()
{
    //Начальные числа 
    string digit_A, digit_B;

    //Массивы для длинной арифметики
    char A[300], B[300], C[300];
    
    //Ввод чисел
    cout << "Enter the first number.." << endl;
    cin >> digit_A;
    cout << "Enter the second number" << endl;
    cin >> digit_B;
    
    //Зеркальное копирование в массивы A,B (для удобства)
    for (int i = 300; i >= 0; i--)
        A[i] = digit_A[i];

    for (int i = 300; i >= 0; i--)
        B[i] = digit_B[i];

    Numbers(A, B, C);
    Summ(A, B, C);
    Symbols(A, B, C);
    
    return 0;
}

Ответы (1 шт):

Автор решения: Harry

Вы бы строки выделяли в тексте комментарием, например,, а то считать до 48 я лично, хоть и умею, но ленюсь :)

У вас массив какой? Например, A?

char A[300]

то есть это элементы в С/С++ и множестве других языков, где отсчет начинается с 0 - с номерами от A[0] до A[299].

К каким элементам вы обращаетесь здесь?

for (int i = 300; i >= 0; i--)
    A[i] = digit_A[i];

К 300, 299, 298, ..., 1, 0.

Нестыковку не замечаете? Выделили 300 элементов, обращаетесь к 301.

Я уж молчу, что в digit_A может быть, скажем всего 3 символа. Что вы копируете (кстати, никак не "зеркально") в 300-й символ? Если в digit_A их, скажем, только 10? выход за пределы выделенной памяти, UB.

Вот пример (ну, не самый эффективный...) суммирования строк. Защита от дурака отсутствует.

string Summ(const string& a, const string& b)
{
    string s;
    int c = 0;
    for(auto ia = a.rbegin(), ib = b.rbegin();
        ia != a.rend() || ib != b.rend();)
    {
        char r =
            ((ia == a.rend()) ? 0 : *ia++ - '0') +
            ((ib == b.rend()) ? 0 : *ib++ - '0') + c + '0';
        if (r > '9')
        {
            c = 1; r = r - 10;
        }
        else c = 0;
        s = r + s;
    }
    return s;
}
→ Ссылка