PDA

Tam Sürümünü Görmek İçin : stingleri birleştirme sorunu


x_wob_x
17/03/2008, 23:23
iki string değişkeni nasıl bir değişkende toparlarız?
yani php'deki şu kodu nasıl c++'da yazabiliriz?


$deneme="Muhittin";
$deneme2="Özer";
$deneme.=$deneme2;



Kusura bakmayın C bilgim hiç olmadığı için böyle bir soru sormak zorunda kaldım arkadaşımın ödevi için düşündüğüm algoritmayı tarif etmem gerekiyor.. :S


hgedek
17/03/2008, 23:35
C de string yoktur.Ama string.h kullanılabilir.Bu kütüphane araştırılırsa iki char* ı birleştiren fonksiyon bulunabilir.

acehreli
17/03/2008, 23:37
C'de cok temiz bir yolu yok; ama eger hedefte yeterince yer varsa strcat kullanilabilir.

C++'ta += kullanabilirsin:


#include <string>
#include <iostream>

using namespace std;

int main()
{
string deneme = "Muhittin";
string deneme2 = "Ozer";

// ikisini de degistirmeden:
string sonuc = deneme + deneme2;

cout << " sonuc: " << sonuc << '\n';

// PHP orneginde oldugu gibi deneme'yi degistirerek:
deneme += deneme2;

cout << "deneme: " << deneme << '\n';
}


Ali

x_wob_x
17/03/2008, 23:52
Çok sağol bu kod işimi gördü ;)

Bir sorum daha olacaktı ekrana yazdırırken nasıl tablo gibi yazdırabiliriz?
örneğin:


ID ADI SOYADI
01 Muhittin Ozer
02 Ahmet Çakar
03 Bilmem Ne
Yani her satırda şu değişken şu kadar karakter sonra yazılsın şeklinde gibi bi kod var mı? Yoksa bunun için kendimiz bi algoritmamı kurmalıyız?

acehreli
18/03/2008, 01:27
C++ akimlari cikti duzenlemede biraz hantal kalirlar aslinda. <iomanip>'te tanimlanan setw, setfill, left, hex, vs. kullanilabilir. Bu ayarlardan bazilari akimi kalici sekilde degistirdigi icin, akimi eski haline cevirmeyi unutmamak gerekir:


#include <iostream>
#include <iomanip>

using namespace std;

void goster(int numara, char const * isim)
{
size_t const numara_genislik = 5;
size_t const isim_genislik = 10;

// cout'un ayarlarini hatirlayalim
ios::fmtflags const eski_ayarlar = cout.flags();

cout << setw(numara_genislik)
<< setfill('_') << numara;

cout << setw(isim_genislik)
<< setfill(' ')
<< left
<< " " << isim << '\n';

// cout'u eski durumuna cevirelim
// Not: bu riskli bir davranis; buraya hic gelemeyebiliriz!
cout.flags(eski_ayarlar);
}

int main()
{
goster(1, "bir");
goster(42, "kirk iki");
}


Bundan sonrasinin soruyla dogrudan ilgisi yok ama bilinmesi gerek: C++'ta hicbir kaynagi acikca kod icinde geri vermememiz gerektigi gibi, mutlaka isletilmesi gereken satirlari da acikca kod icinde yapmamamiz gerekir. Ornegin cout'u eski haline cevirmeye calisan

cout.flags(eski_ayarlar);

satirina hic gelemeyebiliriz; cunku o satirdan once bir hata atilmis olabilir.

En iyisi, kendisine gosterilen bir akimi eski haline sokmakla gorevli bir sinif kullanmaktir. Bu sinif, yapilmasi gereken isi ustlenir ve onu kendi bozucu islevinde yapar:


#include <iostream>
#include <iomanip>

using namespace std;

class AkimDurumuKoruyucu
{
ostream & akim_;
ios::fmtflags eski_ayarlar_;

public:

explicit AkimDurumuKoruyucu(ostream & akim)
:
akim_(akim),
eski_ayarlar_(akim_.flags()) // <-- aklinda tut
{}

~AkimDurumuKoruyucu()
{
akim_.flags(eski_ayarlar_); // <-- eski haline cevir

}
};

void goster(int numara, char const * isim)
{
size_t const numara_genislik = 5;
size_t const isim_genislik = 10;

// cout'un ayarlarini hatirlayalim
AkimDurumuKoruyucu akimKoruyucu(cout);

cout << setw(numara_genislik)
<< setfill('_') << numara;

cout << setw(isim_genislik)
<< setfill(' ')
<< left
<< " " << isim << '\n';

// Artik burada bir sey gerekmiyor; akimKoruyucu'nun bozucusu cout'u
// eski haline cevirecek
}

int main()
{
goster(1, "bir");
goster(42, "kirk iki");
}


Ali