» »

int to string v c++

int to string v c++

mISOk ::

Zdravo!

Imam eno kratko vprašanje. Zanima me kako bi pretvoril int to string v c++. Moram združevanti v string nek niz in mu na konec dodajam nove številke. Zanima me kako sedaj spojiti niz z int vrednostjo.
Primer:
m++;
int y=niz[m-1];
y=y % 6;
niz=niz + y; //to bi želel združiti

Hvala
LP
=]

OwcA ::

Morda kanček prehuda, ampak lehko poskusiš s std::stringstream:
std::stringstream ss;
ss << niz << y;
niz = ss.str();

namesto str() metode se lahko seveda igraš tudi z operatorjem >>.
Otroška radovednost - gonilo napredka.

mISOk ::

Hvala.

Sej ne da ne bi bil hvaležen, ampak a obstaja kakšen enostavnejši način, neki podobnega kot v delphiju npr. IntToStr.

Program pišem v c++ , ker poizkušam en algoritem malo pospešiti, vnašam neko izobljšava pa prejšnji je bil pisan v delphiju pa je kr počasen in bi rad pridobil kakšen procent na hitrosti tudi s c++.

LP
=]

OwcA ::

Tole je skoraj gotovo najhitrejše, če uporabiš prav. Torej, da mečeš notri in nato naenkrat vse pobereš ven.
Otroška radovednost - gonilo napredka.

mISOk ::

std::stringstream ss; to mi ne zagrabi!
Javi mi:
Undefined structure 'stringstream'

help;
=]

OwcA ::

Kakšno knjižnico bi veljalo vklučiti, recimo <sstream>

P.S. kateri prevajalnik uporabljaš?
Otroška radovednost - gonilo napredka.

Zgodovina sprememb…

  • spremenilo: OwcA ()

mISOk ::

Borladn c++ 5.5

Trenutno sem omagal, ne morem več. Hvala za pomoč.

Imam še en problem . Kako pretvoriti pa iz stringa v char.
Imam primer kjer na določeno vrednost x odpiram ustrazno txt datoteko.

ifstream beri("pot\\ime"+x+".txt");

To mi noče delat napiše mi "Lvalue required". Probam ga prelesičit tako da naredim:

string pot = "pot\\ime"+x+".txt"; //dela
ifstream beri(pot);

Mi vrne: "Could not find a match for 'ifstream::basic_ifstream(string)'" torej ne dela string moram dati noter char!

LP
=]

OwcA ::

Iz std::string dobiš polje znakov (char *) z metodo c_str().
Otroška radovednost - gonilo napredka.

OwcA ::

Še to, nizov znakov ne moreš kar tako seštevati, std::string lahko, char* (kar "blabla" predstavlja) pa ne.
Otroška radovednost - gonilo napredka.

SasoS ::

sprintf
fscanf

;)

Zgodovina sprememb…

  • spremenilo: SasoS ()

64202 ::

> cat x.cpp
#include <string>
#include <cstdio>

std::string int2str(int x)
{
        char buf[64];
        sprintf(buf, "%d", x);
        return buf;
}

int main() {
        for(int i=0; i<10000000; ++i)
                int2str(i);

        return 0;
}
> g++ -O3 x.cpp
> time ./a.out

real    0m4.826s
user    0m4.699s
sys     0m0.019s



> cat y.cpp
#include <string>
#include <sstream>

std::string int2str(int x)
{
        std::stringstream ss;
        ss << x;
        return ss.str();
}

int main() {
        for(int i=0; i<10000000; ++i)
                int2str(i);

        return 0;
}
> g++ -O3 y.cpp
> time ./a.out

real    0m17.107s
user    0m16.670s
sys     0m0.025s

nevone ::

Da rezimiram:

tole:

ifstream beri("pot\\ime"+x+".txt");

v tole:

char pot[64];
sprintf(pot, "pot\\ime%d.txt", x);
ifstream beri(pot);

A je kej prov?

o+ nevone
Either we will eat the Space or Space will eat us.

Zgodovina sprememb…

  • spremenila: nevone ()

64202 ::

Tipicno C-jasko programiranje!
>>> d = int('1' + ('0' * (64-len("pot\\ime.txt"))))
>>> d
100000000000000000000000000000000000000000000000000000L
>>> pow(2, 176) >= d
False
>>> pow(2, 177) >= d
True

Ta stvar bo imela buffer overflow na 177 in vec bitnih arhitekturah! Oziroma ce upostevamo se - znak za negativna %d stevila, se prej! Groza!

:)) :D

Gundolf ::

#include <string>
#include <sstring>
#include <fstream>

int i;
std::string s;

// int -> string
std::strinstream       ss;
ss << i;
s = ss.str();

// string -> int
std::strinstream       ss(s);
ss >> i;

// seštevanje stringov
std::string fname = std::string("pot\\ime") + s + ".txt"

// odpiranje fajla
std::ifstream file(fname.c_str());


Takole, mislim da je to vse. Sicer pa sigurno imaš kakšno pomoč glede sistemskih funkcij. In če ti tam piše, da ifstream kot parameter vzame const char* mu ne poskušaj uturiti std::stringa. Še en tip glede seštevanja - seštevaš lahko string + string ali pa string + char*. Zato mora biti prva stvar pri seštevanju vedno std::string (glej zgornjo kodo), potem pa ji lahko dodajaš stringe in char*. Pretvorbe iz ostalih tipov pa le preko stringstreama. In ni ti treba pisat funkcije int2str ampak lahko najprej cel niz narediš v stringstreamu pa ga potem vrneš kot string ali pa celo kar direktno z njim kaj narediš.

Tr0n ::

Vcasih sem vesel, da trenutno programiram v Javi. :)

Gundolf ::

Jaz sem vedno vesel, da lahko programiram v C++.

mISOk ::

Zdravo!

Najprej hvala Gundolf za rešitev. Uporabil sem tvojo rešitev in stvar sprogramiral do konca. Odpravi še tipkarske hrošče in začel zadevo testirati. Prišel sem do zanimivih rezultatov (za mene zalostnih rezultatov).
Program napisan v c++ (imam Borland C++ Compiler 5.5) dela do 5x počasneje kot enak program napisan v Delphi-ju 6. Pa ravo zaradi hitrosti sem pisal program za c++ ker sem ga želel za kak procent pospešiti. zdaj me pa zanima v čem je stos.
Razlika med c++ in delphi kodo programa je v glavnem ni (razen sintaktičnih sprememb). Ali je težava slab c++ prevajalnik ali mogoče to spreminjanje tipov :\ s pomočjo std::stringstream, ker bistvene razlike drugje ne vidim.
delphi -I-I- c++
case -I-I- switch
for -I-I- for
repeat -I-I- do-while
mod -I-I- %
div -I-I- /
Drugo pa nimam.
Poleg tega, da dela delphi v grafičnem načinu, kar bi moral biti minus zanj in plus za c++, ker ne dela v grafiki.

Ima kdo kakšno idejo.
p.s. Upam, da je kriv prevajalnik.

LP
=]

OwcA ::

Imaš vklopljene optimiziacije?
Resda C++ Builder ni ravno čudež od prevajalnika, ampak tako počasi pa vseeno ne bi smelo biti.

Pokažeš morda celo kodo?
Otroška radovednost - gonilo napredka.

Nerdor ::

mISok: Borland vas je (C++ programerje) Punked! Zakaj!? Ker več kot očitno je Delphi prevajalnik optimiziran za Delphi. VCL framework pa za Delphi jezik. Glej, ker je bilo vse več "tečk", ki so tečnarile, kako je C++ kul in te "tečke" hočejo C++ za vsako ceno. Pa je Borland napravil CBuilder. Finta je v temu, da je Delphi jezik precej bolj strog v sintaksi in močno tipiziran, kar za C++ ne moremo reči. Vse preveč ponuja razno raznih varijacij rešitev, da je JOJ! In pri upoštevanju teh razno raznih varijacij C++ Delphi compiler pač proizvede počasno in "nekvalitetno" kodo. Your bad, ker hočeš za vsako ceno C++ ne da bi se vprašal, ali je to dejansko prednost!? NE ni! Delphi kot tak je izjemno kvaliteten jezik (za moj okus bolj kot bebava sintaksa C++, bite me!) in kot IDE zelo kvalitetno orodje in naj bo v prihodnje tako. >:D
... for lifetime!

BigWhale ::

C++ builder najbrz najprej v pascal prevede ;)

mISOk ::

Nerdor hvala za odgovor. prvo sem jo napisal v delphiju, ker mi je sintaksa najbližja "PASCAL FREAK". Sam niti nisem želel pisati za c++, ampak se dobil info da bom zadevo lahko pohitril. Pa sem napisal v c++. Ni mi žal, da sem ga napisal saj sem spet obnovil za mene pozabljeno c++ sintakso. Zdaj ko vidim, da ni prednosti bom poizkušal kodo napisano v c++ optimizirati v linux in videti, če vseeno dobim kaj na hitrosti (da ne bo vso delo šlo v nič).

p.s. Kdo ve kako optimizirati kodo v linux naj mi sporoči. Nisem tega še nikoli počel.
=]

64202 ::

Kaj bi pa rad optimiziral? Nasploh je to, da gres v drug jezik prepisat program, zadnja moznost. Sploh ker ima Delphi ucinkovit prevajalnik. Obicajno optimiziras tako, da TOCNO najdes* od kje do kje ti program pokuri najvec casa - nasploh se vecinoma izkaze, da imas nekje par procentov kode, ki ti pokuri 90% celotnega izvajalnega casa. Problem resis tako, da uporabis bolj ucinkovit algoritem, recimo hash tabelo namesto linked lista. Edino realno prednost, ki jo ima C(++), je ce moras v neki kratki for zanki zmlet nekaj 10MB podatkov (recimo kriptiranje), pa se to glede na Delphi verjetno ni tako grozno velika razlika - vec kot 30-50% ne bi smelo biti.

* en delphijas naj da link na kaksen dober profiler

64202 ::

> Finta je v temu, da je Delphi jezik precej bolj strog v sintaksi in močno tipiziran, kar za C++ ne moremo reči. Vse preveč ponuja razno raznih varijacij rešitev, da je JOJ! In pri upoštevanju teh razno raznih varijacij C++ Delphi compiler pač proizvede počasno in "nekvalitetno" kodo.

Delphi ni dovolj "strog", da bi mu to samo po sebi pri generiranju kode kaj pomagalo. Razlika je predvsem v tem, da je pravilen (in dober) C++ kompiler skoraj nemogoce napisati :), ne postavlja pa sam jezik vecjih zaprek optimizerju napram delphiju. Primer jezika, ki se ga pa da samega po sebi bolje optimizirat, je pa Fortran - namrec nima dinamicne alokacije pomnilnika AFAIK.

Zgodovina sprememb…

  • spremenilo: 64202 ()

64202 ::

Kot opozorilo naslednjim generacijam, ki razmisljajo, da bi program napisali/prepisali v C++, dajem naslednje vprasanje: kaj izpise ta program?
#include <iostream>

struct X {
        X()
        { std::cout << "A" << std::endl; }

        X(const X &o)
        { std::cout << "B" << std::endl; }
};

X getX()
{
        X x;
        return x;
}

int main()
{
        X x(getX());
        return 0;
}



Mozni odgovor(i):
$ g++ --version
g++ (GCC) 3.2.3
Copyright &#169; 2002 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ g++ x.cpp
$ ./a.out
A
$


> cl /EHsc x.cpp
Microsoft &#174; 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86
Copyright &#169; Microsoft Corporation 1984-2002. All rights reserved.

x.cpp
Microsoft &#174; Incremental Linker Version 7.10.3077
Copyright &#169; Microsoft Corporation.  All rights reserved.

/out:x.exe
x.obj

> x
A
B

>

64202 ::

62404 prvi post: res je. Dober in pravilen c++ kompajler je težko napisati. Sam vseeno c++ kot tak ponuja malce preveč "svobode" kot delphi jezik, kar tudi lahko botruje k temu, da je težko napisati dober kompajler zanj (za c++).

Ce smo cisto konkretni - kje ta svoboda skodi pri hitrosti? Edina razlika, ki jo vidim jaz, je da lahko v c++ pises po ramu kolikor hoces, v delphiju pa ne (ali pac?). Tezava pri optimizaciji so torej lahko pointerji. Vprasanje pa je, ali delphi zaradi svoje omejitve lahko kaj bolj optimizira kodo? Po moje ne, kvecjemu obratno, ce delphi preverja dostope v run-timeu. Podobno kot c++ tudi delphi nima just in time compilerja, torej tudi ta oblika optimizacije odpade.

Vesoljc ::

@64202
in kateri je po tvoje bolj pravilen?

ehhh pozabi na vprašanje... tema gre off topic!
za flame war delphi VS C++ si odprite novo temo, ja?
Abnormal behavior of abnormal brain makes me normal...

Zgodovina sprememb…

  • spremenil: Vesoljc ()

64202 ::

Hehe, sem par dni iskal bug, ker sem predpostavil AB (jasno :))). Bi bilo zanimivo videt, kaj rece standard. Tezko verjamem, da bi kaj taksnega kiksnili. Imam sicer se en kup takih neumnosti, samo so dokazi veliko daljsi, oziroma mi jih ni ratalo (== se mi ni dalo) ponovit v cisti "int main()" verziji.

OwcA ::

Intel da prav Microsoftu -- AB.
Otroška radovednost - gonilo napredka.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[C] struct in int[] (strani: 1 2 )

Oddelek: Programiranje
654789 (3862) MrBrdo
»

Mucim se z nalogo C++

Oddelek: Programiranje
6957 (794) MareMareCare
»

C++ preštej število enk

Oddelek: Programiranje
111015 (798) kihc
»

[C++] Pretvorba iz int v char *

Oddelek: Programiranje
232543 (1919) Gundolf
»

[C++] - Tolmačenje povedi in izvedba operacij nad števkami

Oddelek: Programiranje
352808 (2044) jernejl

Več podobnih tem