Bu C programini aciklarmisiniz

Başlatan empax, 05 Mayıs 2011 - 17:12:55

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

empax

Merhaba. Bu C programinda mantigini kavrayamadigim bir kac yer var, aciklarsaniz sevinirim.  :)




#include<stdio.h>
main()
{

char S[250], buf[250];
int string_uzunlugu,i,j;
gets(S);
i=0;

while(S[i] != '\0') /* 1- Mesela burda S`ye atanan kelime "linux" olsun. 5 harfli bu kelime 5 defa mi while ile dondurulecek? Dongu bittiginde i`nin yeni degeri kac olacak? */
{
i++;
}

string_uzunlugu=i;
i=i-1;  /* 2- bu islem neden yapildi ? linux 5 harfli. baslangic sayisi zaten sifir. 1 arttirilmasi gerkemez miydi? */

for(j=0; j<string_uzunlugu; j++)
{
buf[j]=S[i];
i=i-1; /* 3- ayni sekilde bu islemin sebebi nedir? */
}

buf[string_uzunlugu]='\0';

puts(buf);
return 0;
}

/* 4-  Ayrica yazilan kelime programin neresinde nasil terse cevriliyor ? */
بسم الله الرحمن الرحيم
|ACEMİLER İÇİN İLK DURAK|Çözüldü|Kod etiketi|

duffman

anladığım kadarıyla;

1- while 5 defa dönüyor, burdan i=5 olarak çıkıyor.

2- S[250]="linux" olsun, 'l' elemanının indisi 0, 'x' elemanının indisi 4, yani;
S[0]='l'
S[4]='x'
S[5]='\0'

3- for içinde S dizisinde 'x' i buf dizisinin ilk elemanına atıyor, daha sonra i yi sürekli azaltarak S dizisinin önceki elemanlarını, aynı zamanda j yi arttırarak buf dizisinin sonraki elemanlarına atıyor. Yani i'yi azaltmasının sebebi x'ten sonra u, n, i ve l yi ataması.

travego0403

Karakter katarlarının sonuna /0 eklenir.Bu karakter katarının sonunu bildirir.Karakter katarı bizim girdiğimiz karakter sayısından bir fazladır.

2-) i değişkeni dizi içerisinde gezinmemizi sağlayan bir değişken, while döngüsünden çıktığı zaman karakter dizisinin son elemanını gösteren bir haldedir yani /0 göstermektedir.
i=i-1 yapıyoruz ki bundan önceki karakteri göstersin.Bu ters çevirirken işe yarayacak.

3-)İ değişkeni S dizisinin sonunu gösterir haldeydi. j değişkeni de buf dizisinin başını gösterir halde. Her bir adımda S dizisinin sondan başa doğru buf dizisinin başından sona doğru kopyalanıyor.  j artırılıyor i azaltılıyor. i=i-1yaparak sondan geri gelmeyi sağlıyoruz.

4-)for döngüsü içerisinde ters çeviriliyor.

Biraz karışık oldu sanırsam ama inşallah yardımcı olur. :)
"Matematik bir dildir ve bu dilde şairlere fizikçi denir." Richard Feynman

Erdem

gets() in güvenlik açıkları nedeniyle kullanılmaması gerekiyormuş. Bunun yerine daha güvenli olan fgets() kullanılması tavsiye ediliyor.

Hatta daha iyisi D gibi dillere geçip hiç böyle şeylerle uğraşmamak galiba  8)

Örneğin man sayfasından alıntı:

Alıntı YapThis is a _dangerous_ function, as it has no way of checking the
amount of space available in BUF. One of the attacks used by the Inter-
net Worm of 1988 used this to overrun a buffer allocated on the stack
of the finger daemon and overwrite the return address, causing the dae-
mon to execute code downloaded into it over the connection.

Program içinde kodun açıklamalarını yazdım. Tersten yazdırma kısmını da yazacaktım. Ancak C++ ve daha sonra D gibi dilleri kullanınca C kullanmak angarya gibi geliyor. O yüzden bir noktadan sonra ilgimi kaybettim  ???

#include<stdio.h>

int main()
{
    char girilenler[256];
    char tersten[256];

    int sayac = 0;
   
   
    printf("Lutfen bir seyler giriniz: ");      // linux\0
    fgets(girilenler, 256, stdin);

    printf("Girdiginiz sunlardi: %s\n", girilenler);


    while (girilenler[sayac] != '\0') {         /* burada linux\0 a gelene
                                                   kadar tüm karakterler
                                                   arasında teker teker
                                                   dolaşıyor örneğin
                                                   karakter: l
                                                   sayac:  1
                                                */
        sayac++;
    }

    printf("Girdiginiz dizgide %i tane karakter varmis\n", sayac);
    // sondaki \0 yani sonlandırma karakteri yüzünden 6 karakter çıkıyor

    return 0;
}



Eğer Arch Linux tabanlı bir dağıtıma geçmek isterseniz Arcolinux D sürümünü buradan indirebilirsiniz.

Elektronik

empax

Herkese cok tesekkurler. Tum karisiklik i=i-1 den kaynaklaniyordu. `/0` satir sonunu isleme dahil edince sebebi anlasildi.  :)
بسم الله الرحمن الرحيم
|ACEMİLER İÇİN İLK DURAK|Çözüldü|Kod etiketi|

Erdem

Aynı program D'de böyle basitçe ve Türkçe karakterleri de doğru gösterecek şekilde çalışıyor. Sırf örnek olsun diye yazıyorum  :D

import std.string;
import std.stdio;

void main()
{
    char[] giriş;
    readln(giriş);
    // burası sadece satır sonu kodlarını silmek için
    giriş = chomp(giriş);

    char[] tersten = giriş.reverse;
    writeln(tersten);
}
Eğer Arch Linux tabanlı bir dağıtıma geçmek isterseniz Arcolinux D sürümünü buradan indirebilirsiniz.

Elektronik