서형박 Ответов: 2

<C++> У меня есть вопрос о приведении значения


Это алгоритм, который получает число, цифры этого числа, а затем выводит сумму всех чисел, используемых во входном числе. Проблема заключается в том, что если я использую функцию atoi для замены символа в каждом элементе массива, он изменится на правильное число in (например, '5' -> 54321). Какую ошибку я совершил?

Что я уже пробовал:

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iomanip>

using namespace std;

int main()
{
	int N = 0, sum = 0;//N is the number of digits to input. 

	cin >> N;

	char * ptr = new char[N + 1]; //The number is input as a string

	cin >> ptr;

	for (int i = 0; i < N; i++) {
		sum += atoi(&ptr[i]); //Each character stored in the array element is converted to a number and added to the variable sum.
	}

	cout << sum << endl;

	return 0;
}

2 Ответов

Рейтинг:
12

Rick York

Ошибка заключается в том, что atoi принимает строку, и вы передаете адрес различных введенных символов. Другими словами, допустим, вы ввели 3 для N и чисел 1, 2 и 3. Вот значения, которые будут суммированы :

сумма += 123
сумма += 23
сумма += 3

и результат будет 149.

Я думаю, что вы хотите сделать, это добавить каждый символ индивидуально, как это :

сумма += 1
сумма += 2
сумма += 3

Это означает, что вы должны получить двоичное значение введенных символов. Символы вводятся (в проекте MBCS) в режиме ASCII, так что вы можете получить их двоичный эквивалент, вычитая код ASCII для '0' :

int binaryValue = ptr[i] - '0';

и сделайте это для каждого значения в строке. Попробуйте сделать это в отладчике или распечатав каждое значение и сумму в вашем цикле, чтобы получить лучшее представление о том, как это работает.
_________________________________

Это было первое, что пришло мне в голову. Вот еще один способ, который ближе к тому, что вы пробовали.

Этот способ включает в себя создание временной строки для преобразования для каждого значения.

// all of your existing code until the for loop :
   char temp[2] = { 0 } // initialize to all zeros
   for( int i = 0; i < N; ++i )
   {
       temp[0] = ptr[i];   // copy into temporary string's first position
       sum += atoi( temp );
   }
и это все. Temp-это строка из двух символов. Вторая позиция имеет нулевой Терминатор, и это не изменяется. Каждый символ из строки будет помещен в первую позицию, которая преобразуется и добавляется к сумме.


Рейтинг:
1

CPallini

Тебе это не нужно atoi и вы можете использовать немного больше C++ особенности.

#include<iostream>
using namespace std;

int main()
{
  string s{};
  cout << "please enter a number\n";
  cin >> s;
  int sum{};
  for ( const auto & c : s)
    sum += (int) (c - '0');

  cout << sum << endl;
}