Nowe posty

xx Problem ze sterownikami. (5)
2024-04-13, 21:25:16
xx Instalacja xfce4 (2)
2024-04-13, 16:20:17
xx Serie kompilacji bez instalacji dla “emerge” w Gentoo (2)
2024-04-08, 18:40:04
xx Plasma 6 w Neonie ssie trochę mniej ... (17)
2024-04-05, 10:03:46
xx Problem z Linux Lite po instalacji (3)
2024-04-03, 14:23:40
xx Jak właczyć num locka przy starcie systemu debian 12? (12)
2024-04-02, 17:43:54
xx Brak dźwieku w systemie. (5)
2024-04-02, 16:13:41
xx Dystrybucja pod HP Omen (7)
2024-03-29, 11:33:05
xx [Poradnik] Wyszukiwanie Sterowników (2)
2024-03-27, 21:08:23
xx Ile pingwinów? (1)
2024-03-27, 08:59:24

Autor Wątek: konwersja  (Przeczytany 2828 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: 3056
  • 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: 3056
  • 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?