C'de string içerisinde sayı ve karakter çekmek?

Başlatan Mucit23, 22 Ekim 2014, 13:22:45

yldzelektronik

Önce stringin içinde istediğin operatörü arasan, sonra sayı kısımlarını bir diziye alsan ve onları tam sayıya çevirsen olmaz mı? strstr atoi strncpy gibi fonksiyonlar senin işini görür diye düşünüyorum?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

kimlenbu

eğer ödev vs değilse regex konusunu bir araştır derim.

Mucit23

Ödev degil aslında da yapmaya çalıştığım birşey var onun için ogrenmek istiyorum.  Akşam tekrardan bi uğraşacagım. Orta karakteride almayi basarabilirsem tamamdir.

mir_as82

#18
Hocam benim sana verdiğim kod o isi yapiyor.
int main()
{
   char islem[10];

   int op1, op2;
   char yapilacakIslem;
   int k;
   printf("islemi girin : ");
   scanf("%s", islem);
   for (k = 0; k < sizeof(islem); k++) {

      if (!isdigit(islem[k])) {
         yapilacakIslem = islem[k];
         break;
      }
   }
   op1 = atoi(islem);
   op2 = atoi(islem + k * 1 + 1);
   printf("%d\n", op1 );
   printf("%d\n", op2 ) ;
   printf("%c\n", islem[k]);
   return 0;
}

Mucit23

@mir_as82
Sizin kodda sıkıntı yok. :)O cepte, Başka yöntemler öğreniyorum

strchr fonksiyonunda benim işimi görüyor fakat anlamadığım bir nokta var.
aşağıdaki gibi kullanıyorum

char data[]="123-456";
char islem;

islem=*strchr(data,'-');

Yukarıda data stringi içerisinde '-' karakteri varsa onu alıp islem içerisine yerleştiriyor. Yoksa eğer program donuyor. Bu donma meselesini çözsem tamam olacak. Normalde aranılan karakter yoksa eğer null ile geri dönmesi gerekir. Öyle yazıyor. Bu donma ne diye?

MrDarK

Alıntı yapılan: Mucit23 - 24 Ekim 2014, 09:15:40
char data[]="123-456";
char islem;

islem=*strchr(data,'-');

Yukarıda data stringi içerisinde '-' karakteri varsa onu alıp islem içerisine yerleştiriyor. Yoksa eğer program donuyor. Bu donma meselesini çözsem tamam olacak. Normalde aranılan karakter yoksa eğer null ile geri dönmesi gerekir. Öyle yazıyor. Bu donma ne diye?


strchr fonksiyonunu çok da rahat elle yazabilirsiniz bence takılmayın eğer sadece o fonksiyon problemli ise ; Bazen derleyicilerin bu tarz problemleri olabiliyor. Ben özellikle bu hazır fonksiyonları kullanmaktan kaçınıyorum. Çünkü bilgisayardaki gibi kolay işlenmiyor bu kodlar elektronik donanımlarında.

O yüzden elle yazabilirsiniz bence ; bir fonksiyon ilk karakterden data uzunluğunua kadar sizin girdiğiniz bir byte bilgiyi bulursa TRUE döndürsün bulamazsa FALSE döndürsün (:

En temizi ne gerek var strchr gibi şeylere :D
Picproje Eğitim Gönüllüleri ~ MrDarK

yldzelektronik

Alıntı yapılan: MrDarK - 24 Ekim 2014, 10:03:10
En temizi ne gerek var strchr gibi şeylere :D

:) Standart kütüphanedeki dosyaların optimizasyon vs gibi testlerden başarıyla geçerek oraya eklendiğini okumuştum.Yani pek de kaçılmak istenecek şeyler değil bence.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

mir_as82

#22
Alıntı yapılan: Mucit23 - 24 Ekim 2014, 09:15:40
@mir_as82
Sizin kodda sıkıntı yok. :)O cepte, Başka yöntemler öğreniyorum

strchr fonksiyonunda benim işimi görüyor fakat anlamadığım bir nokta var.
aşağıdaki gibi kullanıyorum

char data[]="123-456";
char islem;

islem=*strchr(data,'-');

Yukarıda data stringi içerisinde '-' karakteri varsa onu alıp islem içerisine yerleştiriyor. Yoksa eğer program donuyor. Bu donma meselesini çözsem tamam olacak. Normalde aranılan karakter yoksa eğer null ile geri dönmesi gerekir. Öyle yazıyor. Bu donma ne diye?


Çünkü hocam o fonksiyon eğer o karakteri bulamazsa NULL adres döndürür. NULL adresi dereference etmek ise runtime hatasıdır.

Bence şunu yap. Eğer dönüş değeri NULL ise zaten içinde o karakterden yok deyip hata mesajı ver. Eğer aradığın yazıda aramak istediğin karakter varsa o zaman *strchr () yi degiskenine atayabilirsin.

islem = *strchr(data,'-'); //dediğinizde eğer strchr(data,'-'); dönüşünü NULL adres ise-->  islem = *NULL; gibi olur. O ise çalışma zamanı hatasıdır

MrDarK

Alıntı yapılan: yldzelektronik - 24 Ekim 2014, 11:08:18
:) Standart kütüphanedeki dosyaların optimizasyon vs gibi testlerden başarıyla geçerek oraya eklendiğini okumuştum.Yani pek de kaçılmak istenecek şeyler değil bence.

Şahsen çok çektim hazır fonksiyonlardan. Özellikle eski çalışmalarımdaki CCS'de hala çekiyorum. Keza STM'de de başıma geldi o yüzden uzak duruyorum genelde onların olsun str fonksiyonları :D

Ben babalar gibi yazarım kendi fonksiyonumu :D
Picproje Eğitim Gönüllüleri ~ MrDarK

RaMu

Alıntı yapılan: yldzelektronik - 24 Ekim 2014, 11:08:18
:) Standart kütüphanedeki dosyaların optimizasyon vs gibi testlerden başarıyla geçerek oraya eklendiğini okumuştum.Yani pek de kaçılmak istenecek şeyler değil bence.
Standart fonksiyon bizim kullanıp kullanmayacağımız herşeyi
fonksiyona eklemiş olabilir,
onun optimizasyonu ancak kendinedir,
geçenlerde standart fonksiyon kullanmayıp
8kbyte kazandığımız bir durum oldu mikrocde.

Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

mir_as82

#25
Hocam standart kütüphane dosyalarının %80 i belkide daha fazlası inline dir. Yani kullanıldıkları yere bir nevi kopyala yapıştır mantığı ile eklenirler. Siz kendi fonksiyonunuzu yazarak kopyala yapıştır olayını yapmamış oldunuz. 

Hocam inline fonksiyon olunca stack verilerinin kopyalanması, registerlerin hazırlanması vb. gibi zaman kaybettiren işlemler yapılmaz.
Avantajı şudur: Küçük fonksiyonlarınız varsa ve zamanlama sizin için önemli ise, o zaman inline fonksiyon tanımlamanız (oluşturmanız) faydalı olacaktır. Parametre kopyalama işlemleri, geri dönüş kopyalama işlemleri(bu işlem inline olmayan fonksiyonlarda iki defa yapılır,1-fonksiyonun geri dönüş değeri geçici nesneye kopyalanır 2-geçici nesneden asıl nesneye kopyalanır)
Dezavantajı ise: Eğer çok sık kullanılırlarsa programın boyutunu büyütür.

Ayrıca biz programımızda inline fonksiyonu yazdık diye derleyici bunu inline yapmak zorunda değildir. Derleyiciye ricada bulunuruz aslında. Emir değildir.

pea

Başlıktan biraz da ben yararlanmak istiyorum.
strchr ile string içinde bir karakterin yerini bulup ona göre işlem yapıyoruz.
strtok ile birkaç karaktere göre arama yapabiliyoruz.

Peki bunları mikrokontrolcüde yapmak caiz midir? Finite state machine gibi bir yapı kullansak artısı, eksisi olur mu?
String işlemleri işi çok uzatıyormuş gibime geliyor. Daha efektif bir çözüm nasıl olur?

Hatta aklımdaki sorunu yazayım. UART ile "AB123C12;" gibi bir karakter dizisi yolladık diyelim. Bunun şu şekilde yorumlanmasını istiyorum:
A: A vericisinden geliyorum
B123: B işini 123 sayısına göre yap
C12: C işini 12 sayısına göre yap
;: Seninle işim bitti.
Veri uzunlukları değişken ama sırası hep aynı diyelim.

mir_as82

İlk aklima gelen scanf fonksiyon lari ile formatlama işi ile halledebilirsin. Sscanf, fscanf ve scanf fonksiyonlarini bir arastir.
Formatlayi %c%c%d%c%d%c yaparsan isin belki görülebilir.

Mucit23


mir_as82

Hocam pea nin sorduğu soru üzerine o cevabi verdim.