StrToInt dla kilku liczb

dział ogólny

Re: StrToInt dla kilku liczb

Nowy postprzez Cyfrowy Baron » poniedziałek, 2 grudnia 2013, 22:11

polymorphism napisał(a):AnsiString ma zdefiniowane operatory << >> dla strumieni standardowych, dzięki czemu nic nie musisz konwertować.


Niestety u mnie to nie działa, pewnie dlatego, że istringstream oczekuje typu char więc konwersja jest konieczna.

polymorphism napisał(a):To jest zła konstrukcja. Zawartość zwrócona przez c_str jest tylko do odczytu.


Działa, więc nie może być zła.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: StrToInt dla kilku liczb

Nowy postprzez polymorphism » poniedziałek, 2 grudnia 2013, 22:58

Niestety u mnie to nie działa (...)

A zrobiłeś tak, jak jest napisane w dokumentacji? Nie wiem, jak to się ma do nowszych wersji środowiska, bo to co podałem jest dla szóstki.

Działa, więc nie może być zła.

Oczywiście, że może! Trochę w tym siedzisz i powinieneś już wiedzieć, że nie wszystko, co działa w danej chwili, jest dobrze napisane. Szczególnie w C++! To nawet nie powinno się skompilować... no tak, VCL. W dobrze zaimplementowanych bibliotekach c_str zawsze zwraca wskaźnik const (jeśli w ogóle zwraca jakiś wskaźnik), co jednoznacznie oznacza, że zawartość spod tego wskaźnika jest tylko-do-odczytu.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: StrToInt dla kilku liczb

Nowy postprzez Cyfrowy Baron » wtorek, 3 grudnia 2013, 05:52

Wiem o co ci chodzi z c_str(), ale wiem też, że w C++Builder to zawsze działało. Pokaż jak inaczej byś to zrobił ze string lub AnsiString.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: StrToInt dla kilku liczb

Nowy postprzez polymorphism » wtorek, 3 grudnia 2013, 10:36

Pokazywać nie muszę, bo w sumie to już pokazałeś poprawny przykład z std::stringiem. Z AnsiStringiem byłoby tak samo, tylko pozostaje kwestia "odblokowania" operatorów << >>.

(...) w C++Builder to zawsze działało

Czysty przypadek. Zresztą to jest dobry przykład tego, dlaczego const-correctness jest ważne.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: StrToInt dla kilku liczb

Nowy postprzez Cyfrowy Baron » wtorek, 3 grudnia 2013, 19:26

polymorphism napisał(a): Z AnsiStringiem byłoby tak samo, tylko pozostaje kwestia "odblokowania" operatorów << >>.



[BCC32 Error] Unit1.cpp(43): E2094 'operator>>' not implemented in type 'istringstream' for arguments of type 'AnsiString'

Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: StrToInt dla kilku liczb

Nowy postprzez polymorphism » wtorek, 3 grudnia 2013, 19:59

Zdefiniowałeś VCL_IOSTREAM przed załączeniem pliku dstring.h?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: StrToInt dla kilku liczb

Nowy postprzez Cyfrowy Baron » wtorek, 3 grudnia 2013, 20:17

Gdy to zrobię mogę co prawda użyć operatora >>, ale istringstream wprowadza do zmiennej cały ciąg bez dzielenia na liczy, czyli np. uzyskuję wynik:

1 14 text 19 20

zamiast

1
14
19
20
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: StrToInt dla kilku liczb

Nowy postprzez polymorphism » wtorek, 3 grudnia 2013, 20:42

Według źródła sysclass.h dzieje się tak dlatego, ponieważ jakiś niezbyt ogarnięty programator VCL-a dał jako delimiter wartość zero, a powinien być każdy biały znak. Ręce opadają... :zawiedziony:

--- dodane ---

Machnąłem operator dla AnsiStringa, powinien działać jak należy:
KOD cpp:     UKRYJ  
std::istream& operator >> (std::istream& is, AnsiString& arg)
{
        int c;
        char buf[1024 + 1];
        int n = 0;

        arg = "";

        for(; isspace((c = is.rdbuf()->sgetc())) && c != EOF;
                is.rdbuf()->snextc());

        if(c == EOF)
        {
                is.setstate (std::ios_base::failbit);
                return is;
        }

        do
        {
                if(n == 1024)
                {
                        buf[n] = 0;
                        arg += buf;
                        n = 0;
                }

                buf[n++] = (char)c;
        }
        while(!isspace((c = is.rdbuf()->snextc())) && c != EOF);

        if(c == EOF)
                is.setstate (std::ios_base::eofbit);

        if(n > 0)
        {
                buf[n] = 0;
                arg += buf;
        }

        return is;
}
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Poprzednia strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 58 gości

cron