[c++]sklejanie liter


(Damiankominiak) #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<
                  }

(Blapiter) #2

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 :slight_smile:


(Damiankominiak) #3

własnie o to chodziło , tylko jakbyś mógł wytłumaczyć to at(0) i name.erase


(Blapiter) #4

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().


(Sawyer47) #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.


(Blapiter) #6

@nr47 masz rację, czasem mam manie oczyszczania tego co niepotrzebne :stuck_out_tongue:

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<
	}

}

(Damiankominiak) #7

niech ci bóg w dzieciach wynagrodzi, czytasz w moich myślach, wielkie dzięki


(Sawyer47) #8

To ja się jeszcze przyczepię / powtórzę:

1) Można zarezerwować od razu bufor o długośći name.size() / 2 - tylko jedna alokacja.

2) If jest zbędny, po co rozgałęzienie, skoro wystarczy zmienić instrukcję kroku pętli na i += 2

3) 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[]


(Blapiter) #9

No dobra dziś nie myślę :smiley: :

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]) #10

blapiter , widzę że optymalność kodu ciebie nigdy nie zastanawiała :stuck_out_tongue_winking_eye:

while (plik>>name)

  {

   if(!((++j)&1))

     {

      int len=name.length();

      string bufor;

      bufor.reserve((len+1)>>1);

      for(int i=0;i
      cout<
     }

  }