[]
c++ sorusu...
string p="256x4y"
p gibi bir string içerisinden 256, x , 4, y, terimlerini ayrı ayrı bulup türlerine göre değişkenlerine atamam lazım. Kısa bir yolu var mıdır bunun?
p gibi bir string içerisinden 256, x , 4, y, terimlerini ayrı ayrı bulup türlerine göre değişkenlerine atamam lazım. Kısa bir yolu var mıdır bunun?
strtok kullanman lazım ya da str.h'taki fonksiyonlara bak. bir yolunu bulursun. gerçi çok faydalı bi tavsiye olmadı ama...
- uckac (07.10.09 01:09:18)
c++ bilmem ama c'de şöyle yapabilirsin bunu (c++'ta da çalışır diye tahmin ediyorum):
stdlib.h'daki (c++'taki karşılığı cstdlib'miş galiba) atoi fonksiyonu karakterleri sayılara (int türü) çevirir.
prototipi int atoi (const char *str); şeklinde.
str adresinden başlayarak nümerik olmayan karakterle karşılaşana kadarki nümerik karakterleri int türüne çevirir. yani senin stringte atoi(p) çağrısının 256 sonucunu vermesi gerek. (long türü için atol fonksiyonu)
4'ü almak içinse bu karakterin adresini göndermelisin fonksiyona. string içindeki sırası sabitse atoi(p+4) şeklinde olmalı çağrı. (sabit değilse o zaman kasmak gerekir.)
x, y karakterlerine ise p[3], p[5] ile ulaşabilirsin.
pek kısa olmadı ama c'de stringler librarylere rağmen zordur biraz. belki c++'ta kolay bir yolu olabilir.
stdlib.h'daki (c++'taki karşılığı cstdlib'miş galiba) atoi fonksiyonu karakterleri sayılara (int türü) çevirir.
prototipi int atoi (const char *str); şeklinde.
str adresinden başlayarak nümerik olmayan karakterle karşılaşana kadarki nümerik karakterleri int türüne çevirir. yani senin stringte atoi(p) çağrısının 256 sonucunu vermesi gerek. (long türü için atol fonksiyonu)
4'ü almak içinse bu karakterin adresini göndermelisin fonksiyona. string içindeki sırası sabitse atoi(p+4) şeklinde olmalı çağrı. (sabit değilse o zaman kasmak gerekir.)
x, y karakterlerine ise p[3], p[5] ile ulaşabilirsin.
pek kısa olmadı ama c'de stringler librarylere rağmen zordur biraz. belki c++'ta kolay bir yolu olabilir.
- omnius (08.10.09 12:07:57 ~ 13:10:07)
C'deki karsiligi su sekilde yapilabilir.
siyobik.info
char p[] = "256x4y";
int i;
for (i = 0; p[i] != '\0'; i++)
if (isdigit(p[i]))
p[i] - '0'; // foo
else if (isalpha(p[i]))
// foo
siyobik.info
char p[] = "256x4y";
int i;
for (i = 0; p[i] != '\0'; i++)
if (isdigit(p[i]))
p[i] - '0'; // foo
else if (isalpha(p[i]))
// foo
- carcass (08.10.09 16:10:04 ~ 17:31:16)
@carcass
30 satırlık bir kod yazmıştım aynı işlevi yapan o yüzden fonksiyonlar ilaç gibi geldi fakat benim burda yaşadığım asıl sorun karakterleri sadece teker teker kontrol edebilmem. Yani 256 yerine 8 basamaklı bir sayı da olabilir 4 basamaklı da. Kaç basamak sayı kaç basamak harf olduğu belli değil. O yüzden mesela burda ancak 2-5-6 şeklinde ayırabiliyorum. Benim istediğim 256'yı ayırmak.
Yine de dediğim gibi fonksiyon çok işime yaradı, teşekkürler.
edit: çok özür dilerim. üstekileri carcass için yazmıştım.
30 satırlık bir kod yazmıştım aynı işlevi yapan o yüzden fonksiyonlar ilaç gibi geldi fakat benim burda yaşadığım asıl sorun karakterleri sadece teker teker kontrol edebilmem. Yani 256 yerine 8 basamaklı bir sayı da olabilir 4 basamaklı da. Kaç basamak sayı kaç basamak harf olduğu belli değil. O yüzden mesela burda ancak 2-5-6 şeklinde ayırabiliyorum. Benim istediğim 256'yı ayırmak.
Yine de dediğim gibi fonksiyon çok işime yaradı, teşekkürler.
edit: çok özür dilerim. üstekileri carcass için yazmıştım.
- ocanal (08.10.09 23:18:32 ~ 09.10.09 01:27:58)
atoi'nin tek karakter olarak 2-5-6 değil, doğrudan 256 sayısını vermesi gerek. bunun için ilk sayıda sorun çıkmaması lazım. burdaki sorun diğer sayıların ve karakterlerin stringdeki yerleri belli olmadığı için adreslerini belirlemek. bunu da carcass'ın gösterdiği isdigit benzeri fonksiyonlarla yapabilirsin. eğer acelen yoksa ve soruyu tam olarak söylersen (mesela ondalıklı sayılar da ayrılacak mı, string hep sayıyla mı başlıyor, sayı-harf-sayı-harf gibi belli bir format var mı...) belki biraz daha yardım edebilirim.
- omnius (08.10.09 23:56:29)
@omnius
sayı harf sayı harf formatı evet var fakat bunu kullanıcı gireceği için sayının 3 basamaklı mı 4 basamaklı mı olduğunu bilemiyorsun. sayı-harf-sayı-harf şeklinde gidiyor. Fakat bunun ne kadar böyle gittiğini de bilmiyorsun. String hep sayıyla başlıyor. Sadece integer sayılar girecek kullanıcı.
edit:
Daha açıklayıcı olması açısından soruyu söyliyeyim ben sana en iyisi.
Kullanıcı polinom girecek. 3x^2 + 456x + 5 girecek örneğin bunu "3x2+456x+5" olarak stringe alacağım. (Niye stringe alıyorsun diye sorma sakın.ben de olsam tabiki string kullanmam orada, ama zorunluluk)
*kullanıcı polinom değişkenini her zaman x olarak girecek.
*daha sonra bir iki polinom girdikten sonra o polinomları toplayacağım için üslerini ayrı biyerde,katsayılarını ayrı bir yerde tutacağım. Bunun için linked list kullanabilirim.
zaman sıkıntısı yok.
sayı harf sayı harf formatı evet var fakat bunu kullanıcı gireceği için sayının 3 basamaklı mı 4 basamaklı mı olduğunu bilemiyorsun. sayı-harf-sayı-harf şeklinde gidiyor. Fakat bunun ne kadar böyle gittiğini de bilmiyorsun. String hep sayıyla başlıyor. Sadece integer sayılar girecek kullanıcı.
edit:
Daha açıklayıcı olması açısından soruyu söyliyeyim ben sana en iyisi.
Kullanıcı polinom girecek. 3x^2 + 456x + 5 girecek örneğin bunu "3x2+456x+5" olarak stringe alacağım. (Niye stringe alıyorsun diye sorma sakın.ben de olsam tabiki string kullanmam orada, ama zorunluluk)
*kullanıcı polinom değişkenini her zaman x olarak girecek.
*daha sonra bir iki polinom girdikten sonra o polinomları toplayacağım için üslerini ayrı biyerde,katsayılarını ayrı bir yerde tutacağım. Bunun için linked list kullanabilirim.
zaman sıkıntısı yok.
- ocanal (09.10.09 01:27:33 ~ 01:35:19)
@ocanal
bir de su kod parcasina bak istersen.
siyobik.info
atoi'nin yaptigi islemi basit bir dongu icinde val = val * 10 + (p[i] - '0') gibi klasik bir ifadeyle yapabilirsin.
do {
val = val * 10 + (p[i] - '0');
} while (isdigit(p[++i])); //bir sonraki eleman rakam mi?
i--; // degilse indexi geri al.
bir de su kod parcasina bak istersen.
siyobik.info
atoi'nin yaptigi islemi basit bir dongu icinde val = val * 10 + (p[i] - '0') gibi klasik bir ifadeyle yapabilirsin.
do {
val = val * 10 + (p[i] - '0');
} while (isdigit(p[++i])); //bir sonraki eleman rakam mi?
i--; // degilse indexi geri al.
- carcass (09.10.09 14:06:26)
gerci atoi'nin eksi/arti karakterlerini de algilamasi isini daha da kolaylastirabilir, kodu da oldukca kisaltiyor.
bir de suna bak.
siyobik.info
bir de suna bak.
siyobik.info
- carcass (09.10.09 14:31:44)
@carcass ben de onu çözmeye çalışıyordum şimdi tam, dediğin gibi daha sonra sayıları toplayıp çıkaracağım için işaretleri de önemli,atoi daha işlevsel.
çok teşekkürler.
@omnius
sana da teşekkür ederim.
çok teşekkürler.
@omnius
sana da teşekkür ederim.
- ocanal (09.10.09 15:02:59 ~ 15:04:35)
1