• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Konwertowanie int to string i odwrotnie

VPS Starter Arubacloud
0 głosów
949 wizyt
pytanie zadane 26 marca 2019 w C i C++ przez Marcinek69 Początkujący (450 p.)
edycja 26 marca 2019 przez Patrycjerz

Wytłumaczy mi ktoś jakim cudem te całe konwertowanie u mnie jakoś tak nie chce działać ? Po wielu próbach wkońcu udało mi się znaleźć działający algorytm i stworzylem z niego taką funkcje:

string conversion(int a)
{
    stringstream ss;
    ss << a;
    string str = ss.str();
    return str;
}

I ona działa.

Ale teraz gdy chcę przekonwertować string to int to mnie szlag jasny już trafia, co znajde w internecie to to nie działa.Nawet taka funkcja jak atoi nie działa. Pojawia sie takie cos:

 C:\Users\marcin\Desktop\pliki c++\spoj zabawne dodawanie\main.cpp|54|error: cannot convert 'std::__cxx11::string {aka std::__cxx11::basic_string<char>}' to 'const char*' for argument '1' to 'int atoi(const char*)'|

Wysyłam cały kod jesli kogos by on interesował, program jeszcze nie dokonczony,zapewne dziala jeszcze źle ale nie o to teraz pytam.

Licze na pomoc ;)

#include <iostream>
#include <sstream>
#include <string>
#include <cstdlib>

using namespace std;

string conversion(int a)
{
    stringstream ss;
    ss << a;
    string str = ss.str();
    return str;
}

int main()
{
    int t; //ilosc liczb <80
    int n; //wartosc liczby 1<n<80;
    int Length, helpsize, helpsize2, counter;
    string helpToTurn, str;
    int nTurned, nTurnedHelp,TurnCounter;

    cin >> t;
    for(int i=0; i<t; i++)
    {
        cin >> n;
        str = conversion(n);
        Length=str.size();
        helpsize=Length;
        helpsize2=Length;
        while(true)
        {
            counter=0;
            TurnCounter=0;
            for(int j=0; j<Length; j++)
            {
                if(str[j]==str[helpsize])
                {
                    helpsize--;
                    counter++;
                    if(counter==Length)
                    {
                        cout<<n<<endl;
                    }
                }

                else
                {
                    for(int k=0; k<Length; k++)
                    {
                        helpToTurn[k]=str[helpsize2-k];
                    }
                    nTurnedHelp=atoi(helpToTurn);
                    nTurned=n+nTurnedHelp;
                    n=nTurned;

                }
            }
        }
    }
    return 0;
}

2 odpowiedzi

0 głosów
odpowiedź 26 marca 2019 przez Patrycjerz Mędrzec (192,340 p.)

Zapewne wywołujesz funkcję atoi w taki sposób

std::string s = "1";
int i = atoi(s);

co jest błędem. Funkcja ta nie przyjmuje obiektu klasy std::string, a wskaźnik const char*. Aby przekonwertować stringa, należy użyć odpowiedniej metody zwracającej taki wskaźnik.

int i = atoi(s.c_str());
komentarz 26 marca 2019 przez Marcinek69 Początkujący (450 p.)
Coś zaczęło działać, dzięki :) A czytałem też że w c++ są jakieś nowe sposoby do konwertowania string to int. Polecisz jakiś krótszy ? Wiem ze jakies próbowałem i cos nie działały :)
komentarz 26 marca 2019 przez Patrycjerz Mędrzec (192,340 p.)

PS Dzięki obiektowi klasy std::stringstream też można przekonwertować stringa na inta. Wystarczy użyć sposobu analogicznego do tego z funkcji conversion:

// Kod bez zabezpieczeń, należałoby je dodać w wersji końcowej

int toInt(const std::string& str)
{
    std::stringstream ss;
    ss << str;
    int i;
    ss >> i;
    return i;
}

std::string toString(int i)
{
    std::stringstream ss;
    ss << i;
    return ss.str();
}
komentarz 26 marca 2019 przez Patrycjerz Mędrzec (192,340 p.)

A czytałem też że w c++ są jakieś nowe sposoby do konwertowania string to int. Polecisz jakiś krótszy ?

Kolega Hipcio zaprezentował warte uwagi funkcje wspierane w C++11, które są lepsze od atoi w przypadku używania obiektów std::string. Możesz także użyć metody z std::stringstream, chociaż to nieco przerost formy nad treścią.

komentarz 26 marca 2019 przez Marcinek69 Początkujący (450 p.)
A czym się różni ''const std::string& str'' od np. ''string str''. Pytam się bo nieznam się na takim zapisie wg.
komentarz 26 marca 2019 przez Patrycjerz Mędrzec (192,340 p.)
Jest to referencja na stałą. Samej referencji używa się w celu wykorzystania oryginalnej zmiennej, bez obowiązku jej kopiowania (co przy dużych danych może być zbawienne). Referencja na stałą zaś uniemożliwia modyfikację zmiennej oraz daję możliwość przedłużenia czasu życia zmiennej tymczasowej.
komentarz 26 marca 2019 przez Marcinek69 Początkujący (450 p.)
czyli taki jakby wskaznik ?
komentarz 26 marca 2019 przez Patrycjerz Mędrzec (192,340 p.)
Tak jakby, chociaż nie można dać tutaj znaku równości.
0 głosów
odpowiedź 26 marca 2019 przez niezalogowany

Możesz skrócić kod:

string conversion(int a)
{
    stringstream ss;
    ss << a;
    return ss.str();
}

Pomiędzy const char* i std::string (std::basic_string<char>) jest duża różnica. Musisz użyć c_str() żeby zwrócić const char* przyjmowany przez atoi:

nTurnedHelp=atoi(helpToTurn.c_str());

Od C++11 jedyne sensowne konwersje to std::stoi/std::stol/std::stoll i std::to_string. Proponuję zmienić kompilator na nowszy i włączyć ten standard.

komentarz 27 marca 2019 przez Marcinek69 Początkujący (450 p.)
Dzięki, następny raz będę wiedzial :)
komentarz 27 marca 2019 przez Marcinek69 Początkujący (450 p.)

@Hipcio, Gdy kompiluje program pojawia sie tylko takie coś:

terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc

Process returned 3 (0x3)   execution time : 1.951 s
Press any key to continue.

komentarz 27 marca 2019 przez niezalogowany
Wstaw kod.
komentarz 27 marca 2019 przez Marcinek69 Początkujący (450 p.)

@Hipcio, Chociaż czekaj, chyba wie dlaczego xD

komentarz 27 marca 2019 przez Marcinek69 Początkujący (450 p.)
Poprostu tą linike wkleiłem za wysoko kiedyy program jeszcze nie wiedzial jaka jes wartosc length ;)

Podobne pytania

0 głosów
2 odpowiedzi 2,411 wizyt
0 głosów
1 odpowiedź 465 wizyt
pytanie zadane 21 lutego 2019 w C i C++ przez polek122333 Nowicjusz (150 p.)
0 głosów
2 odpowiedzi 2,989 wizyt
pytanie zadane 1 listopada 2016 w C i C++ przez Stami Gaduła (3,790 p.)

92,452 zapytań

141,262 odpowiedzi

319,077 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...