Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

Diziler hakkında soru.

Başlatan ziyaretci, 10 Eylül 2012, 01:37:02

ziyaretci

 Merhaba;

 
  char abc[20];
  char def[20];
  int t=0;
     
    abc=getchar();
     
      def[t]=abc; t++; 
// her bir karakter geldiğinde "def " dizisinin adreslerini birer artırarak kayıt edeceğim.

  "abc" dizisine sürekli string karakter göndereceğim bu gönderdiğim karakteri "def" dizisinin adreslerine kayıt edeceğim. Yukarıdaki kod derleyici de hata vermiyor ama uygulamada işlev alamıyorum.

Hatta gönderdiğim karakteri direk olarak "abc" dizisine kayıt edip  görüntüyü lcd ye atıyorum herşey gayet güzel. Ama sadece  " def=abc; " eşitleyip  lcd ye "def" dizisini aktardığımda sonuç alamıyorum.

  Vereceğiniz bilgiler hakkında şimdiden teşekkür ederim.

X-Fi

"def" nin "t" inci bytena "abc" stringini atmasını söylüyosunuz. Bunu yapamaz. Şu şekilde düzeltin.

def[t]=abc[t];
t++;


veya "abc" yi dizi olmaktan çıkarın getchar(); fonksiyonu string mi yüklüyor yoksa char mı bilemiyorum ne yapmak istediğinizi tam olarak anlatın yardımcı olalım.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

AsHeS

@erkantr67  yanlış anlamadıysam sınırsız şekilde string almak istiyorsunuz ya da 20 byte lık yer üzerinde durmadan yazım her iki şekilde de şöyle düşünüyorum kendimce :
Birincisi kullandığınız pic hafızası el verdiğince kullanmak için memory allocation yani malloc,calloc,realloc fonksiyonlarını  incelemenizi öneririm.
İkinci durum için @X-Fi arkadaş bir örnek vermiş şöyle de yapılabilir:
"char abc[20];
  char def[20];
char *pdef;
*pdef=&def[0];
  int t=0;
     
    abc=getchar();
     
      *(pdef+t)=abc; t++;
"
şeklinde yapabilirsin yalnız tetikte olman gereken konu 20 byte ı asla aşmaman aşarsan başına iyi şeyler gelmez diyerek özetleyeyim.

ziyaretci

Alıntı yapılan: X-Fi - 10 Eylül 2012, 01:50:51
"def" nin "t" inci bytena "abc" stringini atmasını söylüyosunuz. Bunu yapamaz. Şu şekilde düzeltin.

def[t]=abc[t];
t++;


veya "abc" yi dizi olmaktan çıkarın getchar(); fonksiyonu string mi yüklüyor yoksa char mı bilemiyorum ne yapmak istediğinizi tam olarak anlatın yardımcı olalım.

  istediğim bu deneyince haberdar ederim.

@AsHeS35  yok aşmam ,  sınır koyarım sınıra gelince for döngüsü ile temizlerim. Ayriyetten " *pdef " deki " p "nin anlamı nedir?

arslan74

Merhaba,

getchar() fonksiyonun sadece bir byte veri ceker. Bu veriyi doğrudan dizi adresine atayamazsınız.

Doğrusu şöyle olmalı.

char c;
char index;
char dizi[20];

index = 0;

do
{
   c = getchar();
   dizi[i] = c;

}while(i++<20)


her gelen veri sırayla dizinin içine yerleştirmek için dizi index değişkenini kullandım. Başka şekillerde da yapılabilinir. Ama en basit ve anlaşılır şekli budur.

Selamlar

Erdem

Aslında benim düşüncem de Aslan'ın yazdığı çözüme yakın.

Ama orada bazı eksiklikler var. Örneğin kullanıcı 20 karakter değil de 3 karakter girebilir, ayrıca programın çıktısı karakter olmayan değerleri de ekrana basıyor. Dizi en sonunda sonlandırma karakteri ile sonlandırılmıyor.

Eksiklikleri düzelttikten sonra şu şekilde bir program çıktı:

#include <stdio.h>

#define DIZI_UZUNLUGU 256

int main() 
{
    char dizi[DIZI_UZUNLUGU];
    int i = 0;
    char c = 0;

    while ((c = getchar()) != '\n' && i < DIZI_UZUNLUGU - 1) { 
        dizi[i] = c;
        i++;
        //bu iki satırı kısaltarak şöyle de yazabilirdik:
        // dizi[i++] = c;
    } 
    
    /* diziyi sonlandır böylece dizgi olarak kulanabiliriz */
    dizi[i] = 0;
    printf("%s\n",dizi);
    return 0;
}

bocek

string sonlandırma karakteri '\0' değil mi?
dizi[i] = 0;

değil de;
dizi[i] = '\0';

seklinde olması gerekmiyor mu?
1 ya da 0. işte 'bit'ün mesele..

Erdem

#7
Alıntı yapılan: bocek - 10 Eylül 2012, 11:37:13
dizi[i] = 0;

değil de;
dizi[i] = '\0';

seklinde olması gerekmiyor mu?

İkisi de aynı şey zaten  :)
    const char c = '\0';
    printf("%d", c);


mesaj birleştirme:: 10 Eylül 2012, 12:00:10

Kısaca NULL hariç '\0' ve 0 her ikisi de kullanılabiliyor.

http://stackoverflow.com/a/2911196

ziyaretci

Verdiğiniz bilgilerden esinlenerek istediğimi yaptım teşekkürler .

  2. bir diziye gerek duymayacağım sonradan aklıma geldi :)

Direk

char veri[30];     //yaptım misal

 int t=0;
 int main()
 {
       veri[t]=getch();
     t++;                               // geldikçe kayıt edicem entera bastığımda komple temizleyeceğim vs.vs .  

   /*kontrolüde*/   if(veri[0]=='a' && veri[3]=='b'  && veri[4]==0x0D /*enter adres*/) {  komutlar; } 
  
}



 
    Tekrar teşekkürler.