PDA

Tam Sürümünü Görmek İçin : int bir sayıyı char dizisine eklemek


ankakusu
06/10/2007, 20:23
MErhaba,

int x = 3;
char str[25] = 'kibar yarim esmerim ';

strcat (str , x );

gibi bir şey yapmak istiyorum. ama hata veriyor :


error C2664: 'strcat' : cannot convert parameter 2 from 'int' to 'const char *'
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast


Error executing cl.exe.ben bu problemi nasıl çözebilirim?

Bir sayıyı int haline cevirip de nasıl bir string'in ardına ekleyebilirim?
Bir bilgisi olan
var mı acaba?


sysdev
06/10/2007, 20:29
sprintf (http://www.cppreference.com/stdio/sprintf.html)

CLMan
06/10/2007, 21:34
int x = 3;
char str[25] = 'kibar yarim esmerim ';
char numstr[25];
itoa(x, numstr, 10);

strcat (str , numstr);

FoX_
09/10/2007, 00:22
int x = 3;
char str[25] = 'kibar yarim esmerim ';
char numstr[25];
itoa(x, numstr, 10);

strcat (str , numstr);

itoa fonksiyonu standart bir fonksiyon olmadigi icin kullanilan kutuphanelere gore derleyici bunu taniyabilir, ya da tanimayabilir...

Cozum olarak ise sscanf ile integer olan degeri bir string olarak okuyup, ilk stringin sonuna strcat ile ekleyebilirsin...

half_life
09/10/2007, 02:46
MErhaba,

int x = 3;
char str[25] = 'kibar yarim esmerim ';

strcat (str , x );

Bir sayıyı int haline cevirip de nasıl bir string'in ardına ekleyebilirim?
Bir bilgisi olan
var mı acaba?

yapmak istediğini tam olarak anlamadım. stringin sonuna mesela örneğinde "kibar yarim esmerim" in sonuna 3 "karakterini" mi eklemek istiyorsun yoksa 3 "sayısını" mı eklemek istiyorsun? Eğer sayıysa pointer kullanarak bayt bayt yazarak halledebilirsin fakat okuma konusunda nasıl bir yol izlersin orasını bilemiyecem kodlarını görmeden. string sonuna karakter olarak ekleyeceksen de sayının ayrı ayrı basamaklarını bulup basamağı chara çevirip ekleyebilirsin. İnşallah demek istediğin bu ikisinden biridir. Eğer değilse sorunu biraz daha açık yazarsan sevinirim.

depones
09/10/2007, 15:37
itoa fonksiyonu standart bir fonksiyon olmadigi icin kullanilan kutuphanelere gore derleyici bunu taniyabilir, ya da tanimayabilir...


itoa fonksiyonu standart bir fonksiyon değil diye kullanmak istemezseniz, işlemi standart sprintf fonksiyonu ile aşağıdaki gibi yapabilirsiniz.

#include <stdio.h>

int main()
{
int x = 3;
char str[20] = "kibar yarim esmerim";
char destStr[21];

sprintf(destStr, "%s%d", str, x);


/* Test Kodu */
puts(destStr);

return 0;
}

İyi çalışmalar.

quasimodo
10/10/2007, 14:06
Sozu acilimisken merak ediyorumda hangisi daha kullanisli
sprintf() mi itoa() mi? Hiz?

depones
10/10/2007, 16:23
Hangisinin daha hızlı olduğunun, bugünkü işlemcilerin hızı göz önüne alındığında çok mikro düzeyde kalacağını ve bir öneminin olmayacağını düşünüyorum. Hız bakımından bir algoritmayı değerlendiriyorsanız eğer, -mesela bir sıralama algoritması O(n) = n kare'dir, diğer bir tanesi O(n) = nlogn'dir- seçiminiz programınızın performansını doğrudan, belirgin şekilde etkileyecektir. Ancak, itoa mı sprintf mi daha hızlı, pek önemli değil.

İyi çalışmalar.

Edit: İmla.

Euclides
10/10/2007, 16:54
Hız bakımından bir algoritmayı değerlendiriyorsanız eğer, -mesela bir sıralama algoritması O(n) = n kare'dir, diğer bir tanesi O(n) = nlogn'dir- seçiminiz programınızın performansını doğrudan, belirgin şekilde etkileyecektir. Ancak, itoa mı sprintf mi daha hızlı, pek önemli değil.
İyi çalışmalar.

Algoritmaların hızlarını bu teknikle ölçmek pek geçerli sonuçlar vermez.
Neden ?
O(n) vb.. hız değil complexity ifade eder.

Bu ne demek ?
2 tane memur olsun

a)
a1)Önündeki yığından bir kağıt al
a2)Mühürle ve 10sn bekle
a3)Diğer yığına koy
a4) a1'e git...

b)
b1)Önündeki yığından bir kağıt al
b2)Mühürle ve 10dak bekle
b3)Diğer yığına koy
b4) b1'e git...

a ve b'nin complexity'leri O(1)'dir.
(Çünkü işlem hızları önlerindeki kağıt yığının büyüklüyünden etkilenmez.)
Fakat a ve b'nin hız farkları çok açıktır.

Tabii bu örnek bu bariz, ancak algoritma büyüdükçe bunları görmek zorlaşıyor.
Ör: 4-5 eleman için yazılmış bir insertion/bubble sort, QuickSort'dan çok daha hızlı sıralayabiliyor.

depones
10/10/2007, 17:41
Eleman sayısı arttığı zaman, çoğunlukla quicksort algoritması kullanılarak implemente edilen standart qsort fonksiyonunun Bubble Sort'tan 680 kat daha hızlı çalıştığını ölçmüştüm. Demek istediğim, algoritmaların karmaşıklığının hız üzerinde doğrudan etkisi olduğu. Yalnız, her koşulda en iyi sonucu aynı algoritma verseydi, bir alanda aynı işi yapan çeşit çeşit algoritma olmaz, tek bir algoritma olurdu. Herkes onu kullanırdı.

İlaveten, Big O notasyonunun algoritmanın karmaşıklığı hakkında kesin bir veriyi yansıttığını düşünmüyorum. Algoritmaları karmaşıklıklarına göre gruplandırırken kavrayışı oldukça kolaylaştırıyor. Algoritmalar büyüdüklerinde bunların karmaşıklıklarının tam olarak çözümlenmesi için sayfalarca hesap yapılması gerekebiliyor sanırım.

İyi çalışmalar.

myavuzselim
10/10/2007, 18:00
Ancak, itoa mı sprintf mi daha hızlı, pek önemli değil.
Cogu zaman pek onemli degil diye degistirerek het depones'e hem de euclides'e katildigimi belirteyim. Sanirim en uygunu bir profiler ile sprintf kullaniminin programinda bottleneck olusturup olusturmadigini gormek, daha dogrusu neyin bottleneck olusturdugunu arastirmak.

acehreli
10/10/2007, 21:31
Ama soruyu dogrudan yanitlamak gerekirse, itoa daha hizlidir, cunku sprintf'in yapmasi gereken bir suru seyi yapmaz. sprintf'in donusumu yapmak yaninda sunlarla da ilgilenmesi gerekir:

- vararg duzenegini baslat (va_start)
- duzen dizgisini tara
- icinde donusturulmesi istenenleri tani ve parametreleri va_arg ile teker teker kullan
- istenen ture uygun olarak donustur; eksi isareti olsun mu, sagina soluna bosluk koyulsun mu, vs.
- vararg duzenegini sonlandir (va_end)
- vs.

Ali