Picproje Elektronik Sitesi

SERBEST BÖLGE => Programlama ve Algoritma => Konuyu başlatan: Mucit23 - 22 Ekim 2014, 13:22:45

Başlık: C'de string içerisinde sayı ve karakter çekmek?
Gönderen: Mucit23 - 22 Ekim 2014, 13:22:45
Birşey sorayım,

Sorumu Hesap makinesi örneği üzerinden giderek anlatsam sanırım daha iyi olur

Hesap makinesinde iki değerin toplamı için örneğin 123+456 gibi bir değer giriyoruz. Burada girilen string içerisinden 123 değerini bir tam sayı değişkenine, ortada girilen '+' karakterini bir char türünde değişkene ve en sondaki 456 değerini ayrı bir tam sayı değişkenine aktarmak istiyorum. Bu işlemi C'nin kendi string fonksiyonlarıyla nasıl yaparım?
Başlık: Ynt: C'de string içerisinde sayı ve karakter çekmek?
Gönderen: MrDarK - 22 Ekim 2014, 13:39:57
Hocam merhaba ;

Önce string içerisindeki yerleri parçalamak gerekiyor.

Bu link string parçalamasını anlatıyor ;

http://www.cplusplus.com/reference/cstring/strtok/ (http://www.cplusplus.com/reference/cstring/strtok/)

Bu fonksiyonda ascii olarak yazılmış sayıyı int türüne dönüştürmekten bahsediyor ;

http://www.cplusplus.com/reference/cstdlib/atoi/ (http://www.cplusplus.com/reference/cstdlib/atoi/)

Ama ben genelde kendi fonksiyonlarımı kendim yazıyorum.
Başlık: Ynt: C'de string içerisinde sayı ve karakter çekmek?
Gönderen: Mucit23 - 22 Ekim 2014, 14:19:07
Teşekkürler,
Sanırım strtok fonksiyonu benim işimi görüyor. Nasıl kullanacağımı anladım ama iki sayı arasındaki karakteri nasıl seçeceğimi çözemedim.

char dizi[]="123+456";
char *sayi1;
char *sayi2;
char ortakarakter;
olsa

sayi1=strtok(dizi,"+-/*");
Dersek "123" dizisini sayi1 isimli char diziye gönderir.

Bundan sonra ortadaki karakteri ve ortadaki karakterden sonraki diziyi nasıl alırım?
Başlık: Ynt: C'de string içerisinde sayı ve karakter çekmek?
Gönderen: Klein - 22 Ekim 2014, 14:21:50
Sayı adedi ve format her zaman sabitse; en kolay scanf(..) fonksiyonları ile yapabilirsiniz.

int a, b;
char c;
sscanf(text, "%d%c%d", &a, &c, &b);


not: bir süredir scanf kullanmıyorum. söz diziminde ufak tefek hatalar olabilir.
Başlık: Ynt: C'de string içerisinde sayı ve karakter çekmek?
Gönderen: RaMu - 22 Ekim 2014, 14:36:20
Kullandığın derleyici hbüyük ihtimalle char değişkeni unsigned int olarak tanımlamıştır,
yani char veya int değişkene almanın ne farkı olacak.
printf gibi bir fonksiyonda int tanımlı değişkeninin char karşılığını göster dediğinde problem olmuyorsa tamamdır.
yani;

unsigned int a;
char c;
printf("a'nın degeri=%u,  c'nin degeri=%u ", a,  c);

Buna hata vermiyorsa char a veya unsigned int değişkene almanın farkı olmaz.

Birde dizide elemanlar nasıl saklanıyor önemli,
dizi[]={"123"};
bunu alıp değişkenlere atsan, 0x31,0x32,0x33 görebilirsin.

Bende hazır fonksiyonları pek kullanmadığım için o konuda pek birşey söylemek istemiyorum.
Başlık: Ynt: C'de string içerisinde sayı ve karakter çekmek?
Gönderen: mufitsozen - 22 Ekim 2014, 14:54:44
Alıntı yapılan: Mucit23 - 22 Ekim 2014, 14:19:07
Teşekkürler,
Sanırım strtok fonksiyonu benim işimi görüyor. Nasıl kullanacağımı anladım ama iki sayı arasındaki karakteri nasıl seçeceğimi çözemedim.

char dizi[]="123+456";
char *sayi1;
char *sayi2;
char ortakarakter;
olsa

sayi1=strtok(dizi,"+-/*");
Dersek "123" dizisini sayi1 isimli char diziye gönderir.

Bundan sonra ortadaki karakteri ve ortadaki karakterden sonraki diziyi nasıl alırım?

int num1,num2;   /* diye tanimlarsak */

sayi1 = strtok(dizi,"+");
sayi2 = strtok(NULL,"+");  /* NULL parameter yuzunden strtok multithreaded değildir. dikkat! */

ortakarakter = *(dizi+strlen(sayi1));

int1 = atoi(sayi1);
int2 = atoi(sayi2);

Başlık: Ynt: C'de string içerisinde sayı ve karakter çekmek?
Gönderen: X-Fi - 22 Ekim 2014, 15:09:24
Alıntı yapılan: Mucit23 - 22 Ekim 2014, 14:19:07
Teşekkürler,
Sanırım strtok fonksiyonu benim işimi görüyor. Nasıl kullanacağımı anladım ama iki sayı arasındaki karakteri nasıl seçeceğimi çözemedim.

char dizi[]="123+456";
char *sayi1;
char *sayi2;
char ortakarakter;
olsa

sayi1=strtok(dizi,"+-/*");
Dersek "123" dizisini sayi1 isimli char diziye gönderir.

Bundan sonra ortadaki karakteri ve ortadaki karakterden sonraki diziyi nasıl alırım?

strtok ile geri dönüş veri olarak değil pointer adresi olarak alınır. Herhangi bir kopyalama olmaz. Adres üzerinden diziyi izleyip istediğiniz veriyi parse edebilirsiniz.
Başlık: Ynt: C'de string içerisinde sayı ve karakter çekmek?
Gönderen: mir_as82 - 22 Ekim 2014, 15:15:02
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;
}
Başlık: Ynt: C'de string içerisinde sayı ve karakter çekmek?
Gönderen: mufitsozen - 22 Ekim 2014, 16:02:37
-----------
Başlık: Ynt: C'de string içerisinde sayı ve karakter çekmek?
Gönderen: mir_as82 - 22 Ekim 2014, 16:32:25
Hocam bu strtok fonksiyonunda. ilk parametre ayırım yapılacak string, ikinci parametre ise ayırım yapıcı karakterler.
Burada şunu merak ediyorum. Geri dönüş değeri olarak o bulduğu karakterlerin adresini mi geri döndürüyor?
ikinci sorum ise, bir örnekte gördüm internette ilk parametre NULL pointer olarak veriliyor. Bunun nedeni nedir?
Örnek şu:
/* strtok example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] ="- This, a sample string.";
  char * pch;
  printf ("Splitting string \"%s\" into tokens:\n",str);
  pch = strtok (str," ,.-");
  while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok (NULL, " ,.-");
  }
  return 0;
}

Burada strtok geri dönüş değeri bulduğu adresten bir sonraki adres değer olmaz mı?
Hocam anladım olayı : ). Bu benim dizimi değiştiren bir fonksiyon aslında. Aklıma bu hiç gelmemişti.
Tabi NULL parametre vererek benim dizimin içine yerleştirdiği NULL karakteri o fonksiyona tekrar gönderiyorum ki, artık başlangıç noktan burası diyorum.
Başlık: Ynt: C'de string içerisinde sayı ve karakter çekmek?
Gönderen: X-Fi - 22 Ekim 2014, 17:31:46
Alıntı yapılan: mir_as82 - 22 Ekim 2014, 16:32:25
Hocam bu strtok fonksiyonunda. ilk parametre ayırım yapılacak string, ikinci parametre ise ayırım yapıcı karakterler.
Burada şunu merak ediyorum. Geri dönüş değeri olarak o bulduğu karakterlerin adresini mi geri döndürüyor?
ikinci sorum ise, bir örnekte gördüm internette ilk parametre NULL pointer olarak veriliyor. Bunun nedeni nedir?
Örnek şu:
/* strtok example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] ="- This, a sample string.";
  char * pch;
  printf ("Splitting string \"%s\" into tokens:\n",str);
  pch = strtok (str," ,.-");
  while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok (NULL, " ,.-");
  }
  return 0;
}

Burada strtok geri dönüş değeri bulduğu adresten bir sonraki adres değer olmaz mı?
Hocam anladım olayı : ). Bu benim dizimi değiştiren bir fonksiyon aslında. Aklıma bu hiç gelmemişti.
Tabi NULL parametre vererek benim dizimin içine yerleştirdiği NULL karakteri o fonksiyona tekrar gönderiyorum ki, artık başlangıç noktan burası diyorum.

Hocam diziler NULL ile biter. Bu örnek strtok çalışmasını biraz karışık anlatmış. Şöyle işliyor dizi içeriğini tarayıp Boşluk,virgül,Nokta,Tire herhangi birini bulduğu yere NULL yazarak değiştiriyor dizinin birsonraki pointer adresini geri dönüyor. Sonra bu adresi ekrana çıktı göndererek kullanıyor. Devamında da kalan diziyi (NULL karakterine kadar) özel karaklerler ile parçalamaya devam ediyor.

Aynı şey strchr,strpbrk ile de kolayca yapılır amac uzun dizilerde tek fonksiyon ile diziyi parçalamak. Daha az kod kollanmak.
Başlık: Ynt: C'de string içerisinde sayı ve karakter çekmek?
Gönderen: mir_as82 - 22 Ekim 2014, 18:02:02
Peki hocam ilk parametreye NULL geçiyor bu neden? Yani onun ozel bir manasi mi var??
Aklima şu geldi. Acaba statik olarak bir pointer degisken  tutup, Fonksiyona ilk parametre olarak NULL gecilirse bir önceki adresten baslayarak NULL u buluyor ve o NuLL dan bir sonra sini adres olarak parametre mi aliyor acaba.
Başlık: Ynt: C'de string içerisinde sayı ve karakter çekmek?
Gönderen: Mucit23 - 23 Ekim 2014, 11:34:19
Cevaplar için teşekkürler

Alıntı yapılan: X-Fi - 22 Ekim 2014, 17:31:46
Hocam diziler NULL ile biter. Bu örnek strtok çalışmasını biraz karışık anlatmış. Şöyle işliyor dizi içeriğini tarayıp Boşluk,virgül,Nokta,Tire herhangi birini bulduğu yere NULL yazarak değiştiriyor dizinin birsonraki pointer adresini geri dönüyor. Sonra bu adresi ekrana çıktı göndererek kullanıyor. Devamında da kalan diziyi (NULL karakterine kadar) özel karaklerler ile parçalamaya devam ediyor.

Aynı şey strchr,strpbrk ile de kolayca yapılır amac uzun dizilerde tek fonksiyon ile diziyi parçalamak. Daha az kod kollanmak.

Hocam şimdi strtok fonksiyonunu daha iyi anladım. Ama sanırım işimi görmüyor.

Şöyle;
Alıntı yapılan: mufitsozen - 22 Ekim 2014, 14:54:44
int num1,num2;   /* diye tanimlarsak */

sayi1 = strtok(dizi,"+");
sayi2 = strtok(NULL,"+");  /* NULL parameter yuzunden strtok multithreaded değildir. dikkat! */

ortakarakter = *(dizi+strlen(sayi1));

int1 = atoi(sayi1);
int2 = atoi(sayi2);

Abi verdiğin kod parçasını denedim ve aşağıdaki gibi bir kod yazdım

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>

char data[]="123+456";
char *value1;
char *value2;
char islem;

int main()
{

  while(1)
  {
    value1=strtok(data,"+");
    value2=strtok(NULL,"+");
    islem=data[3];
    printf("1. Deger=%s\n\r",value1);   
    printf("2. Deger=%s\n\r",value2);
    printf("islem=%c\n\r",islem);
    getch();   
  }
}


Burada strtok fonksiyonu çalışıyor. value1=strtok(data,"+"); komutunda strtok + gördüğü yere null koyup önceki karakterleri value1 dizisine gönderiyor.
value2=strtok(NULL,"+"); Bu kodda çalışıyor value2 dizisinin değeri "456" oluyor ama çalışmasını anlayamadım. @Müfit hocam neden null gönderdik?

Dediğim gibi yukarıdaki kodlar çalışıyor ama benim orta karakterimi strtok fonksiyonu siliyor yerine null yazıyor.
yukarıdaki işlemlerden sonra dizinin 3. elemanına bakıyorum islem=data[3];

işlem değeri null çıkıyor normal olarak. Bu sorunu nasıl çözerim?
Başlık: Ynt: C'de string içerisinde sayı ve karakter çekmek?
Gönderen: MrDarK - 23 Ekim 2014, 11:45:56
Alıntı YapDediğim gibi yukarıdaki kodlar çalışıyor ama benim orta karakterimi strtok fonksiyonu siliyor yerine null yazıyor.
yukarıdaki işlemlerden sonra dizinin 3. elemanına bakıyorum islem=data[3];

işlem değeri null çıkıyor normal olarak. Bu sorunu nasıl çözerim?

Hiçbir işlem yapmadan önce yani strtok işlemine tabi tutmadan önce işlemin ne olduğunu öğrenin. Onun içinde strchr fonksiyonu yardımımıza koşuyor.
Örnek : http://www.cplusplus.com/reference/cstring/strchr/ (http://www.cplusplus.com/reference/cstring/strchr/)

strstr fonksiyonu ile de uzun cümle karşılaştırması yapabilirsin.
Link : http://www.cplusplus.com/reference/cstring/strstr/ (http://www.cplusplus.com/reference/cstring/strstr/)
Başlık: Ynt: C'de string içerisinde sayı ve karakter çekmek?
Gönderen: mir_as82 - 23 Ekim 2014, 11:51:14
Hocam bence senin işini bu fonksiyon görmez. Neden dersen. Örnek vereyim
Girilen string "12+20" olsun.= '1', '2', '+' , '2', '0','\0'
ilk çağırmada sana 1 in adresini geri döndürür ve + nın olduğu yere '\0' koyar. Bu strtok fonksiyonu sizin orjinal dizinizde (char dizi) işlem yapan bir fonksiyon. Ve direkt değişikliği onun üstünde yapıyor
ilk çağırmada senin dizi : '1','2','\0' oldu bile. Yani + karakterinin olduğu yere '\0' kondu.
İkinci çağırmanda ise:(Tahminen bu fonksiyonun içinde statik bir değişkende son null karakterin adresi tutuluyor). NULL ile parametre geçince bu statik olarak tutulan adres değişkeninden bir sonrasını alıyor ve diziyi dolaşıp bir sonraki delimiter değişkene kadar ilerliyor ve onu da görünce onun yerine de '\0' koyuyor. sen bu sayede + dan sonraki karakterin adresini alıyorsun.

En son ise NULL paramtere gönderip diziyi dolaşıp orjinal dizinin sonlandıran NULL karakterini görünce '1', '2', '+' , '2', '0','\0' yani bunun sonundaki '\0' ı. işlemini bitiriyor.
Başlık: Ynt: C'de string içerisinde sayı ve karakter çekmek?
Gönderen: yldzelektronik - 23 Ekim 2014, 15:46:58
Ö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?
Başlık: Ynt: C'de string içerisinde sayı ve karakter çekmek?
Gönderen: kimlenbu - 23 Ekim 2014, 16:40:34
eğer ödev vs değilse regex konusunu bir araştır derim.
Başlık: Ynt: C'de string içerisinde sayı ve karakter çekmek?
Gönderen: Mucit23 - 23 Ekim 2014, 18:29:52
Ö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.
Başlık: Ynt: C'de string içerisinde sayı ve karakter çekmek?
Gönderen: mir_as82 - 23 Ekim 2014, 19:05:43
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;
}
Başlık: Ynt: C'de string içerisinde sayı ve karakter çekmek?
Gönderen: 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?
Başlık: Ynt: C'de string içerisinde sayı ve karakter çekmek?
Gönderen: MrDarK - 24 Ekim 2014, 10:03:10
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
Başlık: Ynt: C'de string içerisinde sayı ve karakter çekmek?
Gönderen: yldzelektronik - 24 Ekim 2014, 11:08:18
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.
Başlık: Ynt: C'de string içerisinde sayı ve karakter çekmek?
Gönderen: mir_as82 - 24 Ekim 2014, 11:16:56
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
Başlık: Ynt: C'de string içerisinde sayı ve karakter çekmek?
Gönderen: MrDarK - 24 Ekim 2014, 11:21:37
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
Başlık: Ynt: C'de string içerisinde sayı ve karakter çekmek?
Gönderen: RaMu - 24 Ekim 2014, 11:22:10
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.

Başlık: Ynt: C'de string içerisinde sayı ve karakter çekmek?
Gönderen: mir_as82 - 24 Ekim 2014, 11:35:36
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.
Başlık: Ynt: C'de string içerisinde sayı ve karakter çekmek?
Gönderen: pea - 29 Kasım 2014, 03:35:02
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.
Başlık: Ynt: C'de string içerisinde sayı ve karakter çekmek?
Gönderen: mir_as82 - 29 Kasım 2014, 04:46:46
İ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.
Başlık: Ynt: C'de string içerisinde sayı ve karakter çekmek?
Gönderen: Mucit23 - 29 Kasım 2014, 09:40:42
Hocam  strtok fonksiyonu ile hallettim.
Başlık: Ynt: C'de string içerisinde sayı ve karakter çekmek?
Gönderen: mir_as82 - 29 Kasım 2014, 11:00:36
Hocam pea nin sorduğu soru üzerine o cevabi verdim.
Başlık: Ynt: C'de string içerisinde sayı ve karakter çekmek?
Gönderen: Mucit23 - 23 Aralık 2016, 15:16:16
Selamlar

Bu konuda benzer bir sorunum var.
Aşağıdaki gibi bir dizim var.
char text[265]="1.Deger|607|349|473|758|130|872|744|278|323|109|540|665|492|242|387|803|727|529|340|712|303|469|009|857|760|033|699|378|116|835|097|326|212|667|710|333|379|649|279|021|667|272|793|036|785|245|128|391|294|157|701|353|808|244|568|590|624|296|030|103|322|466|549|224#";
Elimde bu şekilde stringler bulunmakta ve '|' karakterleri arasında hedefimde olan değerler var. Toplam 64 adet bu şekilde 3 elemanlı sayı bulunuyor. Ben bu sayıları string içerisinden çekmeye çalışıyorum. İki sayı arasında '|' karakteri ile ayrac var. Dizi sonunda da '#' var

Birazcık uğraştım ama STRTOK fonksiyonu ile yapamadım. İşimi görmeyecek gibi. Bende farklı bir yöntemle yaptım

int main()
{
char text[264]="00:01|607|349|473|758|130|872|744|278|323|109|540|665|492|242|387|803|727|529|340|712|303|469|009|857|760|033|699|378|116|835|097|326|212|667|710|333|379|649|279|021|667|272|793|036|785|245|128|391|294|157|701|353|808|244|568|590|624|296|030|103|322|466|549|224#";
    int i=0;
    char data=0, substring[3];
    int count=0;
    int parseval[65],parse_index=0;
   
    for(i=0;i<262;i++)
    {
    data=text[i];
    if(data=='|' || data=='#')
{
if(data=='|')count=3;

if(parse_index>0)
{
   parseval[parse_index-1]=atoi(substring);
   printf("%03d\n\r",parseval[parse_index-1]);
}

parse_index++;
      }

switch(count)
{
case 3:count--;break;  // Bu karakteri boş geçiyoruz.
case 2:substring[0]=data;count--;break;
case 1:substring[1]=data;count--;break;
case 0:substring[2]=data;break;
}
}

getch();
}

Çalışıyor. Ama pek aklıma yatmadı. Kulağı tersten tutma gibi birşey oldu. Daha efektif bir çözüm arıyorum. Bunu daha etkin bir şekilde nasıl yaparım?

DevC de denedim çalışıyor.
Başlık: Ynt: C'de string içerisinde sayı ve karakter çekmek?
Gönderen: XX_CİHAN_XX - 23 Aralık 2016, 15:35:42

void getNumber(char indis, char* result, char* source)
{
char c;
for(c=0; source[c]!='#'; c++)
{
if(source[c]=='|')
{
if(--indis==0)
{
result[0] = source[c+1];
result[1] = source[c+2];
result[2] = source[c+3];
result[3] = 0;
break;
}
}
}
}

int main(int argc, char *argv[])
{

char text[265]="1.Deger|607|349|473|758|130|872|744|278|323|109|540|665|492|242|387|803|727|529|340|712|303|469|009|857|760|033|699|378|116|835|097|326|212|667|710|333|379|649|279|021|667|272|793|036|785|245|128|391|294|157|701|353|808|244|568|590|624|296|030|103|322|466|549|224#";
char res[4];

getNumber(17, res, text);
printf(res);

return 0;
}


void getNumber(char indis, char* result, char* source)
bu fonksiyon ile istediğin indisteki sayıyı alabilirsin devc++ da çalışıyor.
Başlık: Ynt: C'de string içerisinde sayı ve karakter çekmek?
Gönderen: vitruvius - 23 Aralık 2016, 18:41:31
strtok (http://www.cplusplus.com/reference/cstring/strtok/) ile de olur.

Yapmak istediğiniz bu değil mi?

#include <stdio.h>
#include <string.h>

int main ()
{
  char text[265]="1.Deger|607|349|473|758|130|872|744|278|323|109|540|665|492|242|387|803|727|529|340|712|303|469|009|857|760|033|699|378|116|835|097|326|212|667|710|333|379|649|279|021|667|272|793|036|785|245|128|391|294|157|701|353|808|244|568|590|624|296|030|103|322|466|549|224#";
  char *spText;
  spText = strtok (text,"|#");
  while (spText != NULL)
  {
    printf ("%s\n",spText);
    spText = strtok (NULL, "|#");
  }
 
  return 0;
}