#c #arrays #pointers
#c #массивы #указатели
Вопрос:
Я только начал изучать, как использовать массив указателей, и я пробую примеры, чтобы узнать о них больше, но я легко запутываюсь в них. Итак, я попытался выполнить простое арифметическое вычисление, используя массив указателей.
Пользователь введет 2 строковые переменные для добавления. Затем я переворачиваю строковую переменную.
string reverseString(string s1)
{
int i = 0;
int j;
char temp;
j = s1.length() - 1;
while (i < j)
{
temp = s1[i];
s1[i] = s1[j];
s1[j] = temp;
i ;
j--;
}
return s1;
}
Я попытался преобразовать 2 строковые переменные, которые у меня есть, в массив целочисленных указателей, прежде чем добавлять их вместе
void stringtoInt(stringamp; s1, stringamp; s2)
{
int size1 = s1.size();
int size2 = s2.size();
intPtr intArray;
intPtr intArray2;
intArray = new int[size1];
intArray2 = new int[size2];
for (int i = 0; i < size1; i )
{
intArray[i] = s1[i] - '0';
}
for (int i = 0; i < size2; i )
{
intArray2[i] = s1[i] - '0';
}
addInteger(intArray, intArray2);
}
Я передал массив целых чисел 2 в функцию и попытался выполнить некоторое вычисление сложения
void addInteger(intPtr intArray, intPtr intArray2)
{
int *p = intArray;
int *q = intArray2;
intPtr total = new int[MAX];
int i = 0;
int sum = 0;
int carried = 0;
while (*p != '' || *q != '')
{
*(total i) = *p *q carried;
if(*(total i) > 9)
{
*(total i) %= 10;
carried = 1;
}
else
carried = 0;
i ;
p ;
q ;
}
printArray(total, i);
}
И вот как я считываю свой массив указателей
void printArray(intPtr total, int size)
{
for(int i = 0; i < size; i )
cout << *(total i);
}
После попытки отладки этого массива целых указателей я все еще не могу понять, что с ними не так, и я только начал изучать, как использовать массив целых указателей.
Комментарии:
1.
j = s1.length()
вот в чем проблема…2. Возникает много проблем. Большинство из них, вероятно, было бы решено, если бы вы начали использовать стандартные контейнеры C , такие как
std::vector
, и вместо этого использовали итераторы.3. @JoachimPileborg Я слышал о векторах, но мне сказали вместо этого использовать массив указателей для решения такого рода проблем.
4. @barakmanos Мне пришлось использовать это, чтобы узнать длину моей строки, прежде чем менять местами целые числа.
5. Указатели — отличный способ попасть в проблемы. Хотя вектор не защищен от выхода за пределы (если вы не используете
at
функцию-член), они упрощают динамическое добавление и удаление элементов, а также перебор элементов.
Ответ №1:
Проблема в том, как вы используете строковый ограничитель из строк и помещаете их в целочисленные массивы.
Завершителем строки является ''
, который равен нулю. Это означает, что когда вы делаете '' - '0'
, результат получается (в кодировке ASCII) 0 - 48
. Я думаю, это не то значение, которое вы ожидаете.
Это означает, что в вашей addInteger
функции, где вы проверяете наличие ''
символов в вашем целочисленном массиве, вы можете выйти за рамки. Это приводит к неопределенному поведению.
Или, если в любом из массивов целых чисел есть фактический ноль, вы остановитесь на полпути.
В любом случае вы получите неверный результат.
Вы не можете использовать строковый ограничитель в качестве ограничителя для целых массивов. Вам нужно либо использовать фактические размеры из строк и проверить это. Или, как я упоминал в комментарии, используйте соответствующий контейнер C и итераторы (или индексы).
Ответ №2:
Заменить:
j = s1.length();
с:
j = s1.length()-1;
Последний символ строки находится в length-1
, а не length
.
Кроме того, в stringtoInt
вы не копируете завершающий » в intArray1
и intArray2
, поэтому это условие:
while (*p != '' || *q != '')
неверно в addInteger
. Передайте размер из stringtoInt
в addInteger
и замените while
цикл на for
цикл такого размера.