Динамический массив не заполняется. Не могу понять почему
Пытаюсь перевести из string в int и в коде столкнулся с тем, что динамический массив по какой-то причине не заполняется. Вернее заполняется лишь одна ячейка. Никак не могу понять, что не так. Вроде прогоняю через for, размер массива не равен единице. Но каждый раз он взамен старому число перезаписывает новое. Знаю, что можно воспользоваться готовыми функциями. Но хотелось как-то самому голову поломать. А потом уже и с функциями разобраться. Вроде через atoi.
int string_to_number(const std::string& s) {
int strnum = s.size();
int *ary = new int[strnum];//этот массив не заполняется
int *ary2 = new int[strnum];//этот просто задел на будущее
int digits[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int digits2[10] = { 48, 49, 50, 51, 52, 53, 54, 55, 56, 57 };
int digits3[10] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 };
for (int a = 0; a < strnum; a++) {
ary[a] = s[a];//и здесь каждый раз заново заполняется лишь одна ячейка, вместо 4х
}
for (int a = 0; a < strnum; a++) {
for (int b = 0; b < 10; b++) {
if (ary[a] == digits2[b]) {
ary[a] = digits[b];
}
}
}
for (int a = 0; a < strnum; a++) {
for (int b = strnum; b > 0; b--) {
ary[a] = ary[a] * digits3[b];
}
}
int result = 0;
for (int a = 0; a < strnum; a++) {
result = result + ary[a];
}
delete[] ary;
delete[] ary2;
return result;
}
int main()
{
std::string str = "1234";
std::cout << "Size of string is " << str.size() << std::endl;
std::cout << string_to_number(str) << std::endl;
return 0;
}
Ответы (3 шт):
Понимаете, очень странный метод у вас. Разбираться, почему в нем не работает та или иная строка - куда сложнее, чем набросать нормальное решение.
Если строка - положительное натуральное число, а в случае сбоев (ну, там, буква среди цифр) как признак этого возвращаем -1, то этих нескольких строк вполне достаточно:
int string_to_number(const std::string& s)
{
int res = 0;
for(char c: s)
if (c < '0' || c > '9') return -1; else res = res*10+c-'0';
return res;
}
Это не ответ на ваш вопрос "не могу понять, почему динамический массив не заполняется", потому что там динамический массив вообще не нужен...
В итоге у меня такой монстр получился:
int string_to_number(const std::string& s) {
int strnum = s.size();//выявляю размер стринг
int *ary = new int[strnum];//создаю динамический массив ary
int digits[11] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1 };//создаю массив всех цифр
int digits2[11] = { 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45 };//создаю массив ранвых по значению в int цифр char
int digits3[10] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 };//создаю массив для финального результата
int digits4[11] = { 1, 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 };
for (int a = 0; a < strnum; a++) {
ary[a] = s[a];//приравниваю значения s в динамический массив ary
}
for (int a = 0; a < strnum; a++) {
for (int b = 0; b < 11; b++) {
if (ary[a] == digits2[b]) {//сраниваю показатели digits2 и ary
ary[a] = digits[b];//перевожу значения в цифровые
}
}
}
int b = strnum - 1;
if (ary[0] > 0) {
for (int a = 0; a < strnum; a++) {
ary[a] = ary[a] * digits3[b];//перемножаю
b--;
}
}
else
{
for (int a = 1; a < strnum; a++) {
ary[a] = ary[a] * digits4[b];//перемножаю
b--;
}
}
int result = 0;
if (ary[0] > 0) {
for (int a = 0; a < strnum; a++) {
result = result + ary[a];
}
}
else {
for (int a = 1; a < strnum; a++) {
result = result + ary[a];
}
result *= -1;
}
delete[] ary;
return result;
}
int main()
{
std::string str = "-721";
std::cout << "Size of string is " << str.size() << std::endl;
std::cout << string_to_number(str) << std::endl;
return 0;
}
Вот с корректировкой на @Harry
int string_to_number(const std::string& s) {
int result = 0;
if (s[0] == '-') {
for (int a = 1; a < s.size(); a++) {
result = result * 10 + s[a] - '0';
}
result *= -1;
}
else {
for (char c : s) {
result = result * 10 + c - '0';
}
}
return result;
}