целое число мусора при добавлении массива указателей 2 целых чисел

#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 цикл такого размера.