Nowe posty

xx Dystrybucja pod HP Omen (6)
Wczoraj o 23:30:08
xx [Poradnik] Wyszukiwanie Sterowników (2)
Wczoraj o 21:08:23
lamp Problem z Linux Lite po instalacji (0)
Wczoraj o 19:50:30
xx Ile pingwinów? (1)
Wczoraj o 08:59:24
xx konfiguracja pale moon (0)
2024-03-24, 21:53:42
xx Plasma 6 w Neonie ssie trochę mniej ... (10)
2024-03-23, 02:38:11
xx problem z instalacja sterowników do karty sieciowej (3)
2024-03-18, 18:10:16
xx Plik abc.001 (1)
2024-03-17, 17:48:27
xx Zlecę dopracowanie programu w MatLab (0)
2024-03-13, 15:28:40
xx Linux Mint 21.3 XFCE brak dźwieku po paru minutach (karta muzyczna zintegrowana) (5)
2024-03-12, 23:07:01

Autor Wątek: konwersja  (Przeczytany 2819 razy)

kordi

  • Gość
konwersja
« dnia: 2014-02-12, 09:57:36 »
Hej!
Chciałabym dokonać konwersji string na int. Znalazlam nastepujacy sposob za pomoca biblioteki BOOST:
#include
#include

char * argv = "1234578";
    using boost::lexical_cast;
    using boost::bad_lexical_cast;

    std::vector args;

    while (*++argv)
    {
        try
        {
            args.push_back(lexical_cast(*argv));
        }
        catch(const bad_lexical_cast &)
        {
            args.push_back(0);
        }
    }
 cout << "SIZE = " << args.size() << endl;
    for (int i = 0; i < args.size(); i++){
        cout << args[i] << endl;
    }
}
Nie wiem dlaczego ale wyniki zostaja wyswietlane od drugiego elementu oraz rozmiar wektora również jest o 1 element zbyt mały.
Również zbytnio nie rozumiem warunku while(*++argv). Czy to oznacza: wykonuj tak długo aż napotkasz ostatni element?

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3049
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
konwersja
« Odpowiedź #1 dnia: 2014-02-12, 16:57:06 »
W samym warunku while zwiększasz już argv. Lexical_cast robiony jest zatem już dla elementu następnego. Wywal ++ z warunku i daj argv++ po klamerce zamykającej catch.

Ale:  chcesz konwertować string na int,  czy nauczyć się castów? Bo jak to pierwsze, to strasznie na około to robisz...
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

snajper_8383

  • Gość
konwersja
« Odpowiedź #2 dnia: 2014-02-12, 17:28:15 »
W wyrażeniu *++argv najpierw nastąpi inkrementacja a potem wyłuskanie. Dlatego zaczyna ci się od drugiego elemetu. Te dwa wyrażenie są równowazne: *++argv == *(++argv). Zmienna argv jest łańcuchem, a łańcuch jest zakończony zerem, więc pętla bedzie się wykonywała do osiągniecia zera. Jeśli coś napisałem źle to proszę o poprawienie, bo patrzę na to jak programista C a nie C++. (C++ za bardzo nie znam).

A cały proces zamienienia  łańcucha na int-a można prościej zrobić, tak jak wspomniał przedmówca.
 #include 
 
 int main (void)
 {
 char z;
 char *str = "1234589";
 int num = 0;
       
 while ((z = *str++))
    num = num * 10 + (z - '0');
   
  return 0;
 }

kordi

  • Gość
konwersja
« Odpowiedź #3 dnia: 2014-02-12, 21:01:45 »
Wielkie dzięki chłopaki!
Robie sobie takie ćwiczenie:
Find the greatest product of five consecutive digits in the 1000-digit number.
Także napisałam taki kodzik:
#include
#include
#include
#include

using namespace std;

int main(){
    char * argv = "731671765313306";
using boost::lexical_cast;
    using boost::bad_lexical_cast;

    std::vector args;

    do
    {
        try
        {
            args.push_back(lexical_cast(*argv));
        }
        catch(const bad_lexical_cast &)
        {
            args.push_back(0);
        }
    }while(*++argv);

    int product = 1;
    int final_product = 0;
    int temp = 0;

    for (int i = 0; i <= args.size(); i++){
 int product = 1;
    int final_product = 0;
    int temp = 0;

    for (int i = 0; i <= args.size(); i++){
        product = product*args[i];
        if (i%4 == 0){
            if(product > final_product){
                temp = final_product;
                final_product = product;
                product = 1;
            }
        }
    }

    cout << final_product << endl;

}
Cytat: pkraszewski
Ale:  chcesz konwertować string na int,  czy nauczyć się castów? Bo jak to pierwsze, to strasznie na około to robisz...
O castach nawet nie slyszalam :) Jeszcze nie ten level :)
Próbowałam wybrnąć z tego problemów np. za pomocą funckji atoi:
std::string myString = "45";
int value = atoi(myString.c_str()); //value = 45
Jak widac caly string jest zamieniany na liczbe, a o to mi nie chodzi.
Jeśli jest jakieś prozstrze rozwiązanie mojego problemu, to będę niezmiernie wdzięczna za podpowiedź.

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3049
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
konwersja
« Odpowiedź #4 dnia: 2014-02-12, 21:50:13 »
OT: Project Euler?
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

kordi

  • Gość
konwersja
« Odpowiedź #5 dnia: 2014-02-12, 21:56:49 »
Cytat: pkraszewski
OT: Project Euler?
Tak :)

Ok, juz wiem. Prozstrzym sposobem jest wstawic elementy stringa do tablicy intów. :)

Jednakże chciałabym się spytać  szybkość. Z tego co poczytałam to biblioteka boost ma przyspieszyć działałanie naszych programów. Czy w tym przypadku tez tak się stanie?