Переполнение строки
Проблема в том что компилятор на 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 шт):
Вы бы строки выделяли в тексте комментарием, например,, а то считать до 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;
}