ошибка: неверное преобразование из '__gnu_cxx :: __ alloc_traits :: value_type '{aka' char '} to' const char * '[-fpermissive] - PullRequest
0 голосов
/ 02 апреля 2020

сталкивается с ошибкой, я пытаюсь преобразовать значения char, это стек в int, а затем возвести их в квадрат. Я пытался использовать atoi () и sscanf (), но все же я сталкиваюсь с этой ошибкой

#include <stack>
#include<iostream>
#include<cmath>
#include<string>
#include <sstream> 

using namespace std;
int main(){
        int n;
        std::cin>>n;
        long long int num = n;
        while(num != 1){
            stack<char>s;
            string strnum = to_string(num);
            for(int i=0;i<strnum.size();i++){
                s.push(strnum[i]);
            }
            num = 0;
            while(!s.empty()){
                int x=0;
                //sscanf(s.top(),"%d",&x);
                x = atoi(s.top());
                num += (x*x);
                std::cout << x << std::endl;
                s.pop();
            }
    cout<<"num is : "<<num<<endl;
        }

        std::cout<<1;

}

1 Ответ

0 голосов
/ 02 апреля 2020

В этом вызове

x = atoi(s.top());

объект типа char передается в качестве аргумента функции atoi, которая ожидает аргумент типа char *. Обратите внимание, что этот стек определен как стек отдельных символов.

stack<char>s;

Вы можете написать

x = s.top() - '0';

Если вы хотите, чтобы число, сохраненное в исходной строке, помещалось на затем в стеке пишем

        const int Base = 10;
        int multiplier = 1;
        num = 0;
        while(!s.empty()){
            int x=0;
            //sscanf(s.top(),"%d",&x);
            x = s.top() - '0';
            num += multiplier * x;
            multiplier *= Base;
            //...

Если вы хотите получить число в обратном порядке, тогда пишите

        const int Base = 10;
        num = 0;
        while(!s.empty()){
            int x=0;
            //sscanf(s.top(),"%d",&x);
            x = s.top() - '0';
            num = Base * num + x;
            //...

Имейте в виду, что есть стандартная функция std::stoi, которая выполняет необходимые преобразование строки в число.

И вам следует использовать объект типа unsigned int. В противном случае пользователь может ввести отрицательное число, и оно будет обработано неправильно. Вот демонстрационная программа

#include <iostream>
#include <string>
#include <stack>

int main() 
{
    unsigned int n;

    while ( std::cin >> n && n != 0 )
    {
        std::string strnum = std::to_string( n );
        std::stack<char> s;

        for ( char c : strnum ) s.push( c );

        unsigned long long int num = 0;

        while ( !s.empty() )
        {
            unsigned int digit = s.top() - '0';
            num += digit * digit;
            s.pop();
        }

        std::cout << "num = " << num << '\n';
    }

    return 0;
}

Если ввести число 123, то его вывод может выглядеть как

num = 14

, то есть 1 * 1 + 2 * 2 + 3 * 3 == м 14.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...