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

Jak zamienić string w int ? C++

Object Storage Arubacloud
0 głosów
46,629 wizyt
pytanie zadane 16 sierpnia 2015 w C i C++ przez szymek6786 Początkujący (260 p.)
Jak zamienić string na int w C++ ?

I dlaczego ten kod nie działa poprawnie ?

 

#include <iostream>

using namespace std;

string a;
int b[5];

int main()
{
    cout << "Zmienna typu string (5 znakow): _____\b\b\b\b\b";
    cin >> a;

    cout << endl << "Po konwersji: " <<endl <<endl;

         for (int i=0; i<5; i++)
         {
         b[i]=(int)a[i];
         cout << "Zmienna typu int, znak nr " << i+1 << " ->  " << b[i] << endl;
         }

    return 0;
}

 

5 odpowiedzi

+4 głosów
odpowiedź 16 sierpnia 2015 przez Dorion300 Szeryf (90,250 p.)
wybrane 16 sierpnia 2015 przez szymek6786
 
Najlepsza

Możesz zrobić takie coś:

string str = "123";
int i = atoi(str.c_str());

Potrzebujesz jeszcze nagłówek: cstdlib

komentarz 16 sierpnia 2015 przez szymek6786 Początkujący (260 p.)
super działa, dzięki
+2 głosów
odpowiedź 16 sierpnia 2015 przez daan Pasjonat (17,640 p.)

Jeżeli twój kompilator wspiera C++11 to najłatwiejszym rozwiązaniem będzie użycie funkcji stoi.

string s = "12";
int x = std::stoi(s);

Jeżeli nie, to polecam użycie stringstream.

komentarz 16 sierpnia 2015 przez szymek6786 Początkujący (260 p.)

Używam Code Blocksa 13.12. Uczę się programowania dopiero od paru dni.

Nie za bardzo potrafię użyć tej funkcji w moim przypadku, tak nie działa:

 

​
#include <iostream>
#include <sstream>

using namespace std;

string a;
int b[5];

int main()
{
    cout << "Zmienna typu string (5 znakow): _____\b\b\b\b\b";
    cin >> a;

    cout << endl << "Po konwersji: " <<endl <<endl;
    for (int i=0; i<5; i++)
    {
    b[i] = stoi(a[i]);
    cout << "Zmienna typu int, znak nr " << i+1 << " ->  " << b[i] << endl;
    }

    return 0;
}

komentarz 16 sierpnia 2015 przez daan Pasjonat (17,640 p.)
edycja 16 sierpnia 2015 przez daan

nie potrzebujesz tablicy 5 elementów na 5 cyfrowa liczbe, wystarczy że wczytasz string a następnie zrobisz int b = stoi(a); i ten int będzie tą liczbą ze stringa. :)

#include <iostream>
#include <string>

using namespace std;
 
string a;
int b;
 
int main()
{
    cout << "Zmienna typu string (5 znakow): _____\b\b\b\b\b";
    cin >> a;
 
    cout << endl << "Po konwersji: " <<endl <<endl;

    b = stoi(a);
    cout << "Zmienna typu int :  " << b << endl;
 
    return 0;
}

Ale może się zdarzyć, że w Code::Block's ten kod nie zadziała, ponieważ używa starszej wersji kompilatora przez co nie wszystkie nowe (już nie takie nowe) funkcje działają :)

komentarz 16 sierpnia 2015 przez szymek6786 Początkujący (260 p.)
chyba ta funkcja niestety nie działa w moim codeblocksie ale dzięki

 

Twój kod też nie zadziałał :/
+1 głos
odpowiedź 16 sierpnia 2015 przez niezalogowany
edycja 16 sierpnia 2015

Najlepiej użyj do tego stringstream:

#include <iostream>
#include <sstream>
 
using namespace std;
 
string a;
stringstream ss;
string b;
 
int main()
{
    cout << "Zmienna typu string (5 znakow): _____\b\b\b\b\b";
    cin >> a;
 
    cout << endl << "Po konwersji: " <<endl <<endl;
 
    ss << a;
    b=ss.str();
    cout << b;
 
    return 0;
}

Powinno działać ;) Jak chcesz dokładniejszych wytłumaczeń to napisz w komentarzu ;)

komentarz 16 sierpnia 2015 przez szymek6786 Początkujący (260 p.)
no szczerze mówiąc to nie bardzo załapałem o co w tym chodzi co mi wysłałeś, chodzi mi o przekonwertowanie 5-cyfrowej liczby zapisanej w string'u na int'a z tym żeby każda z tych cyfr wpadła do oddzielnej "szufladki" tablicy typu int.
komentarz 16 sierpnia 2015 przez szymek6786 Początkujący (260 p.)
już sobie poradziłem funkcją atoi ale dzięki :)
komentarz 16 sierpnia 2015 przez niezalogowany
Oj, sory, zapomniałem o forum ;)

Ale jak to już sobie poradziłeś? Przecież chciałeś mieć to w tablicy O_o Dorion300 zrobił to w tylko jednej zmiennej int...
komentarz 16 sierpnia 2015 przez szymek6786 Początkujący (260 p.)
myślałem że konieczna jest tablica do tego ale dało się prościej
komentarz 16 sierpnia 2015 przez niezalogowany
Aha, spoko. Ale dobrze, że już ci wszystko działa ;)
komentarz 16 sierpnia 2015 przez szymek6786 Początkujący (260 p.)
edycja 16 sierpnia 2015 przez szymek6786

Jednak z tablicą też postanowiłem zrobić, trochę pokombinowałem i wyszło mi, tylko że trochę to zrobiłem bezmyślnie, nie rozumiem jak działa ta funkcja ss, oto kod:

jakbyś mi z grubsza mógł objaśnić jak mi to zadziałało to byłbym wdzięczny :)

i czym jest ten "stringstream" tak jakoś na chłopski rozum, bo dopiero zacząłem naukę

 

​
#include <iostream>
#include <sstream>

using namespace std;

int a[1000];
stringstream ss[1000];
string s;

int main()
{
    cout << "Zmienna typu string : ";
    cin >> s;

    cout << endl << "Po konwersji: " <<endl <<endl;

    for (int i=0; i<=s.length(); i++)
    {
        ss[i] << s[i];
        ss[i] >> a[i];
        cout << i+1 <<". " << a[i] << endl;
    }

    return 0;
}
+1 głos
odpowiedź 16 sierpnia 2015 przez Patrycjerz Mędrzec (192,320 p.)

Co do konwersji, to tego typu pytań była masa na tym Forum.

A co do kodu, to konwersja typu char (string to tablica charów) na int nie zamienia np. "1" w stringu na "1" w intcie, tylko przypisuje intowi wartość bajtu, który odpowiada znakowi "1" w tablicy ASCII. Jeśli chcesz przekonwertować te typy co do wartości liczby, a nie jej kodu, to użyj sposobu, który polecił kolega, lub (jeśli masz nowy kompilator) metody std::stoi.

+1 głos
odpowiedź 16 sierpnia 2015 przez Krawiec91 Pasjonat (19,600 p.)
Myślę, że kod by zadziałał jeśli po zrzutowaniu na int, odjąłbyś 30h (48) od powstałego int'a. Bo przy tym kodzie, który zamieściłeś pewnie Ci wyświetla kody ASCII znaków liczb (30h .... 39h), a w zapisie dziesiętnym 48...57.
Inne rozwiązania tego problemu, koledzy wcześniej zamieścili. Jeszcze innym rozwiązaniem jest konwersja string'a do C - stringa (tablicy char) za pomocą c_str(), a potem użycie funkcji atoi().
komentarz 16 sierpnia 2015 przez szymek6786 Początkujący (260 p.)
Też mi przyszło do głowy żeby odejmować od każdej liczby ale wolałem pożądnie zrobić, tą funkcją atoi działa, dzięki
komentarz 16 sierpnia 2015 przez Krawiec91 Pasjonat (19,600 p.)
Przy tym programie to każdy z zaproponowych sposobów będzie porządny i o podobym stopniu pracochłonności. Ten sposób z odjęciem liczby 30h od znaku zrzutowanego na int, to raczej nic innego jak funkcja atoi() czy std::stoi() wykonywana na pojedyńczym znaku.  Jeśli miałbyś ze stringa np. "123" skonwertować to do liczby typu int, to sposób, roboczo go nazwę "assemblerowy" żeby skonwertować to na int'a się komplikuje. A jeszcze bardziej jak masz tam jakieś znaki literowe np. "123 km/h". Wtedy prościej jest użyć czy atoi(), czy std::stoi().
Dużo przyzwyczajeń mi zostało z kodowania w assembly, sporo robiło się konwersji między liczbami a znakami, typu zamienić liczbę na znak i wyświetlić ją na na wyświetlaczu, odebrać znak z portu szeregowego i zamienić go na liczbę, żeby potem obliczenia na tej liczbie wykonywać. Więc takie tu pomysły podrzucam.;)

Podobne pytania

0 głosów
1 odpowiedź 451 wizyt
pytanie zadane 28 maja 2016 w C i C++ przez programer Obywatel (1,190 p.)
0 głosów
4 odpowiedzi 643 wizyt
pytanie zadane 5 stycznia 2016 w C i C++ przez sialekk Nowicjusz (170 p.)
0 głosów
2 odpowiedzi 1,929 wizyt
pytanie zadane 26 sierpnia 2015 w C i C++ przez patryk16 Obywatel (1,080 p.)

92,568 zapytań

141,420 odpowiedzi

319,622 komentarzy

61,954 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...