damcios
(Damiankominiak)
4 Maj 2011 15:55
#1
mam taki problem, wczytuje plik tekstowy, wyświetlam z wyrazów parzystych , litery parzyste i mam taki problem , czy da sie , żeby program widział to jako słowa a nie pojedyncze znaki??chodzi mi oto żeby program nie wyświetlał ciągu znaków z tych słów, ale pozostałe litery z tych stringów.
while (plik>>name){
++j;
if(j%2==0){
for( i=1;i
cout<
}
Na szybko zrobiłbym coś takiego :
while (plik>>name)
{
++j;
if(j%2==0)
{
string bufor;
int licznik=0;
while(!name.empty())
{
if(licznik % 2 == 0)
{
bufor += name.at(0);
}
name.erase(name.begin());
++licznik;
}
cout<
}
}
i w tedy w buforze masz “cały” wyraz
damcios
(Damiankominiak)
4 Maj 2011 17:30
#3
własnie o to chodziło , tylko jakbyś mógł wytłumaczyć to at(0) i name.erase
Generalnie korzystam z referencji na http://www.cplusplus.com/ >> http://www.cplusplus.com/reference/string/string/
name.at(0) to nic innego jak name[0] tylko w bezpieczny sposób gdyby wyszło poza obszar zwróci wyjątek a nie wysypie się program.
name.earase to funkcja w obiekcie string która usuwa wskazaną pozycje w stringu w tym przypadku pierwszą name.begin().
nr47
(Sawyer47)
4 Maj 2011 17:43
#5
Można od razu zarezerwować bufor o odpowiednim rozmiarze. No i szybciej będzie raczej bez niszczenia oryginalnego stringu, po prostu zrobić pętlę for z krokiem 2 i kopiować literki.
@nr47 masz rację, czasem mam manie oczyszczania tego co niepotrzebne
To zapisze od razu dla @damcios tą optymalniejszą wersję:
while (plik>>name)
{
++j;
if(j%2==0)
{
string bufor;
for(int i=0; i
{
if(i % 2 == 0)
bufor += name.at(i);
}
cout<
}
}
damcios
(Damiankominiak)
4 Maj 2011 18:14
#7
niech ci bóg w dzieciach wynagrodzi, czytasz w moich myślach, wielkie dzięki
nr47
(Sawyer47)
4 Maj 2011 18:18
#8
To ja się jeszcze przyczepię / powtórzę:
Można zarezerwować od razu bufor o długośći name.size() / 2 - tylko jedna alokacja.
If jest zbędny, po co rozgałęzienie, skoro wystarczy zmienić instrukcję kroku pętli na i += 2
W tym przypadku at jest zbędne, bo wiadomo jaką długość ma napis jak i ma się pełną kontrolę nad wartościami indeksów => operator[]
No dobra dziś nie myślę :
while (plik>>name)
{
++j;
if(j%2==0)
{
string bufor;
bufor.resize(name.length() % 2 == 0 ? name.length()/2 : name.length()/2 + 1);
for(int i=0, j=0; i
{
bufor[j] = name[i];
}
cout<
}
}
_alex
([alex])
4 Maj 2011 20:16
#10
blapiter , widzę że optymalność kodu ciebie nigdy nie zastanawiała
while (plik>>name)
{
if(!((++j)&1))
{
int len=name.length();
string bufor;
bufor.reserve((len+1)>>1);
for(int i=0;i
cout<
}
}