[]

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?


 
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.
  • 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
  • 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.
  • 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.
  • 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.
  • 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
  • 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.
  • ocanal  (09.10.09 15:02:59 ~ 15:04:35) 
1
buraya yazılanların hakları Sir Anthony Hopkins'e aittir.
yazan eden compumaster, ilgilenen eden fader
modere edenler angelus, Artibir, aychovsky, baba jo, basond, compumaster, deckard, duyulmasi gerektigi kadar, fader, fraise, groove salad, kahvegibi, kaymaktutmayansicaksut, kibritsuyu, monstro, pandispanya, robin, ron dennis
bu sitede yazılanların hiçbiri doğru değildir. site içeriği küçükler için sakıncalı olabilir. yazılardan yazarları sorumludur. kaynak göstermeden alıntılanamaz. devlet tarafından atanmış bir kurumun internet üzerinde kimin hangi bilgiye ulaşıp ulaşamayacağına karar vermesi insan haklarına aykırıdır. web siteleri kullanıcıların istekleri doğrultusunda bağlandıkları yerlerdir. kullanıcılar isterlerse bir web sitesine bağlanmayabilirler. bu güçleri ve imkanları mevcuttur. bir kullanıcı bir siteye bağlanmak istiyorsa bu onun tercihi ve hakkıdır. bağlanmak istemiyorsa bu yine onun tercihi ve hakkıdır. halkın kendisine hizmet etmesi için görevlendirdiği kurumlar hadlerini aşıp halka neye ulaşıp ulaşmayacağını bilmeyen cahil cühela muamelesi edemezler. ebeveynlerin çocuklarını sakıncalı içeriklerden koruması için çok sayıda bedava ve ücretli yazılım mevcuttur. bu yazılımlar bir web tarayıcısını kullanmaktan daha karmaşık teknik bilgi gerektirmemektedir. devletin milletini küçük düşürmesi ve ebleh yerine koyması yasaktır. Skimlinks ile linkler üzerinden yönlendirme payı alınmaktadır.