->C<- Soru Çözümü

Başlatan Sh4oTT, 22 Ağustos 2015 - 03:48:39

« önceki - sonraki »

0 Üyeler ve 4 Ziyaretçi konuyu incelemekte.

Sh4oTT

Yok hocam bu degil hocam ben bır for dongusu yapacam mesela elımde bır ınt dızı[] var ama kac elamanlı oldugunu bılmıyorum bu for dongusununde dızının sonuna gelınce bıtmesını ıstıyorum bunun ıcın sordum.
Yanı dızı 5 elemanlı ıse for dongusu 5 defa donecek 10 elemanlı ıste 10 defa donsun bunu nasıl kontrol ederım ?

Not: Elemanları kullanıcıdan aldırmıyorum, yukardakı gıbı uzun bır dızı oldugunu farz edelım  uzun oldugu ıcın tek tek saymak ıstemıyorum hepsı bu :)

Amenofis

Alıntı yapılan: ShaoTT - 10 Aralık 2015 - 20:05:30
Yok hocam bu degil hocam ben bır for dongusu yapacam mesela elımde bır ınt dızı[] var ama kac elamanlı oldugunu bılmıyorum bu for dongusununde dızının sonuna gelınce bıtmesını ıstıyorum bunun ıcın sordum.
Yanı dızı 5 elemanlı ıse for dongusu 5 defa donecek 10 elemanlı ıste 10 defa donsun bunu nasıl kontrol ederım ?

Not: Elemanları kullanıcıdan aldırmıyorum, yukardakı gıbı uzun bır dızı oldugunu farz edelım  uzun oldugu ıcın tek tek saymak ıstemıyorum hepsı bu :)

Tek tek saymak nedir? Böyle bişey yok.
Dizinin uzunluğu bilinmiyor ise ya kullanılan eleman sayısını elle vereceksin ya da bitiş noktasını istisna bir değer ile işaretleyeceksin. Karakter dizilerinde istisna değeri 0 oluyor çünkü 0 numaları bir karakter yok. Eğer elemanların hepsi pozitif ise -1 ile işaretleyebilirsin. Ya da 0'dan büyük iseler 0 ile işaretlemek daha iyi olur.

lnxdev

#52
Zaten bundan ötürü pointerlar var pointterda oluşturduğun malloc uzunluğu yetmesse tekrar realloc komutuyla genişletip uzunluğunu sürekli elinde tutabilirsin örneğin başlangıç olarak 5 uzunluğunda bir dizin var mallocla bunu oluşturukdan sonra 5 kere değer alırısın eğer kullanıcı hala değer girmeye başlıyorsa uzunluğu realloc fonksiyonu ile tekrar uzatırsın örneğin 5 daha ekledin ve senin uzunluğun şuan 10 oldu. Döngü içersinde kaç tane değer aldığını sayac la tutup kullanıcı değer girmeyi bitirdikten sonra uzunluk değişkenine girdiği sayaca eşitlersin böylece dizinin uzunluğunu hem almış olup hemde en son değere *pointer + sayac şeklinde ulaşabilirsin. Dediğim olay dışında unsigned int zaten cevabını vermiş uzunluğu aldıktan sonra for döngüsüne uzunluğu belirticeksin. Ama dediğim gibi eğer dizinin uzunluğunu bilmiyorsan pointerlarla çalışman daha iyi olucaktır hemde rami iyi yönetmiş olucaksın örnek istersen koyabilirim.

#include <stdio.h>


int main(){

int sayidizi[5] = {1,2,3,4,5},i;
int uzunluk = sizeof(sayidizi)/sizeof(*sayidizi - 1);

for(i = 0; i < uzunluk; i++)
printf("%d ", sayidizi[i]);

printf("\n");

}

Reverser

@ShaoTT, anlatmak istediğin şey önceden belirsiz(değişken) sayıya sahip bir dizi üzerinden işlem yapmaktı sanırım ? Bunun için dynamic memory allocation kullanmalısın.

XFCE ROCKS !
Powered by Thunar & XFWM4



Sh4oTT

@Amenofis tek tek saymaktan kastım ornegın 100 elemanlı bır dızı var ben oturup tek tek bu dızı kac elemanlıymıs sayayımda for dongusune ona gore ayarlıyayım manasında soyledım hocam :) Dizi sonunu -1 veya 0 ile isaretlemek aklıma yattı tesekkur ederım :)

@lnxdev hocam cevabınız ıcın tesekkur ederım oncelıkle, burdakı asıl sorun su kullanıcıdan gırdı almıyoruz elımizde bulunan  cok elemanlı bır dızının mesela 150 elemanlı olsun ama bız bılmıyoruz tabı 150 elemanlı oldugunu ve oturup saymak da ıstemıyorum. Bu dızının for dongusunde dizinin sonuna geldıgımızı nasıl kontrol ederız :)

@unsigned int hocam anlatmak ıstedıgım tamda oyle hocam dedıgınız konuya bır goz atayım tesekkurler :)

Amenofis

@ShaoTT
Bak şimdi dizinin sonu diye bişey C'de yok. Sonu belli olmadığı için sayamazsın da.

int dizi[100]; ya da
int *dizi = (int *) malloc(sizeof(int) * 100);
dediğin zaman şu anlama gelir. Derleyici bu 100 elemanlık yeri başka nesneler için kullanmaz. Fakat bundan sonrası belli değil. Yani 101. noktayı kullanabilir de kullanmayabilir de. Sen sana ayrılan yeri kafana göre kullanırsın, yani illaki 100 tane olacak diye bişey yok. Mesela;

int *a = dizi;
int *b = dizi + 40;
int *c = dizi + 80;
Şimdi mantıksal olarak 3 tane diziymiş gibi kullanabiliriz bunları. a' ya fazla yazdığın zaman b'ye ait olan yere girer. b' ye fazla yazdığın zaman c'ye girer. c'ye fazla yazarsan bilinmeyen bölgeye girer.

void fonk(int *x)...
Şimdi ben buna a' yı geçirirsem max 100 adet eleman kullanabilir. c' yi geçirirsem max 20 tane kullanabilir. Bunu anlamasının tek yolu ya ekstra bir parametre ile bilgi vericem ya da durma noktasını özel bir değer ile işaretliyecem başka yolu yok.

Sh4oTT

@Amenofis, anladım hocam tesekkur ederim :)

Sh4oTT

#57
Bu hatayı neden alıyorum, nasıl duzeltırım?



-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Asagıdakı ornekte gırılen cumlenın uzunlugunu bulmak ıstıyorum ama bosluk karakterıne geldıgınde duruyor. Neden space karakterını NULL olarak goruyor?

// GIRILEN CUMLENIN UZUNLUGUNU BULMAK //

#include <stdio.h>


int uzunlukBul(char *); // PROTOTIP

int uzunlukBul(char *ptr) {

int i=0;

while (*(ptr+i)!='\0') {

i++;
}

return i; // UZUNLUGU DONDUR


}





int main() {
char dizi[50];

printf("Uzunlugunun bulunmasini istediginiz cumleyi giriniz: ");
scanf("%s", &dizi);

// UZUNLUGU BULUP YAZDIRALIM

printf("Cumlenin Uzunlugu: %d\n\n", uzunlukBul(dizi));


}

Reverser

#58
Gets() fonksiyonu buffer overflow saldırılarına çok müsait olduğu için güvenlik uyarısı almışsın sıkıntı yok.
White space için şuraya göz at [1] http://stackoverflow.com/questions/3221031/counting-newlines-spaces-and-tabs

XFCE ROCKS !
Powered by Thunar & XFWM4



Sh4oTT

#59
@Reverser gets() fonksiyonlu nasıl calıstırabılırım? :)

Reverser

@ShaoDownLiNuP, senin yazdığın kodu ben derleyebiliyorum
#include <stdio.h>

int main()
{
char dizi[100];

puts("cumle gir:");
gets(dizi);
puts("cumle:");
puts(dizi);

}

biliyorum, kendi halinde kod yazıyorsun fakat cidden gets fonksiyonunu kullanmamalısın. C11 standartında gets fonksiyonu artık yer almıyor mesela.
[1] https://www.quora.com/Why-is-the-gets-function-removed-from-C11
[2] [alternatif olarak fgets, gets fonksiyonu neden tehlikeli ?] http://stackoverflow.com/questions/1694036/why-is-the-gets-function-so-dangerous-that-it-should-not-be-used

XFCE ROCKS !
Powered by Thunar & XFWM4



Sh4oTT

@Reverser dedıgınız gıbı hocam kendı halımde ogrenmek amaclı yazıyorum derleyebılseydım ıyı olurdu gcc surumunden dolayımı olmuyor acaba?

gcc -v
Yerleşik özellikler kullanılıyor.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/i686-pc-linux-gnu/5.3.0/lto-wrapper
Hedef: i686-pc-linux-gnu
/build/gcc/src/gcc-5.3.0/configure --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://bugs.archlinux.org/ --enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++ --enable-shared --enable-threads=posix --enable-libmpx --with-system-zlib --with-isl --enable-__cxa_atexit --disable-libunwind-exceptions --enable-clocale=gnu --disable-libstdcxx-pch --disable-libssp --enable-gnu-unique-object --enable-linker-build-id --enable-lto --enable-plugin --enable-install-libiberty --with-linker-hash-style=gnu --enable-gnu-indirect-function --disable-multilib --disable-werror --enable-checking=release
seçenekleriyle yapılandırıldı.
Evre modeli: posix
gcc version 5.3.0 (GCC)

Sh4oTT

Bir sorum var yardımcı olurmsunuz

Klavyeden girilen bir cümlenin, her kelimedeki harflerinin yerlerini rastgele şekilde degiştiren bir program yazınız.

Or: Bir cümle girin: C'de dosya islemleri.
Cıktı: d'Ce osdya slemrieil.

ShangriLa

Alıntı yapılan: ShaoDownLiNuP - 28 Aralık 2015 - 10:40:16
Bir sorum var yardımcı olurmsunuz

Klavyeden girilen bir cümlenin, her kelimedeki harflerinin yerlerini rastgele şekilde degiştiren bir program yazınız.

Or: Bir cümle girin: C'de dosya islemleri.
*çıktı: d'Ce osdya slemrieil.
https://ideone.com/4v2eBW
Ubuntu Mate Trusty

Reverser

@ShangriLa, verilebilecek en güzel örnek olmuş, yazım şeklin çok iyi okurken zevk aldım. :)

XFCE ROCKS !
Powered by Thunar & XFWM4



ShangriLa

Alıntı yapılan: Reverser - 28 Aralık 2015 - 23:09:30
@ShangriLa, verilebilecek en güzel örnek olmuş, yazım şeklin çok iyi okurken zevk aldım. :)

Aslında karakterleri okudugum while içerisinde de yapılabilirdi de gereksiz karmaşıklaştırmak yerine bir while daha kullandım.
Ubuntu Mate Trusty

Sh4oTT

#66
@ShangriLa, teşekkür ederim ellerinize saglık :)


Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 29 Aralık 2015 - 14:27:47

Asagıdakı kodu calıstırdıgım zaman parcalanma hatası cekırdek dokuldu dıyor sebebı nedır ve nasıl cozebılrım?


// STRUCTRES // -- 74Lh4 --

#include <stdio.h>



int main () {


// YAPI BILDIRIMI

struct kitap {

char *kitapIsmi;
char *yazar;
char *yayinevi;
int sayfaSayisi;
int basimYili;

};

struct kitap teknikKitaplar[3];


int i=0;

for (i=0; i<3; i++) {

printf("%d. Teknik kitabin: \n", i+1);
printf("Ismi: "); scanf("%s", &teknikKitaplar[i].kitapIsmi);
printf("Yazari: "); scanf("%s", &teknikKitaplar[i].yazar);
printf("Yayinevi: "); scanf("%s", &teknikKitaplar[i].yayinevi);
printf("Sayfa sayisi: "); scanf("%d", &teknikKitaplar[i].sayfaSayisi);
printf("Basim Yili: "); scanf("%d", &teknikKitaplar[i].basimYili);
}

printf("KITAPLARIMIZ: \n\n");


for (i=0; i<3; i++) {
printf("%d. Kitab: \n", i+1);
printf("Ismi: %s\n", teknikKitaplar[i].kitapIsmi);
printf("Yazari: %s\n", teknikKitaplar[i].yazar);
printf("Yayinevi: %s\n", teknikKitaplar[i].yayinevi);
printf("Sayfa sayisi: %d\n", teknikKitaplar[i].sayfaSayisi);
printf("Basim Yili: %d\n\n", teknikKitaplar[i].basimYili);



}

}

ShangriLa

Alıntı yapılan: ShaoDownLiNuP - 29 Aralık 2015 - 10:38:02
Asagıdakı kodu calıstırdıgım zaman parcalanma hatası cekırdek dokuldu dıyor sebebı nedır ve nasıl cozebılrım?

Kitap structu icerisindeki char cinsinden olan pointerlerlar sadece bir karakteri point ediyor (bunu nasil Turkce yazacagimi bilemedim :-)).

Ayrica, scanf zaten pointer argumani almakta. Sen pointerin referansini yolluyorsun.

Dogrusu su olacak:


// STRUCTRES // -- 74Lh4 --

#include <stdio.h>



int main () {


    // YAPI BILDIRIMI

    struct kitap {

        char kitapIsmi[1024];
        char yazar[1024];
        char yayinevi[1024];
        int sayfaSayisi;
        int basimYili;

    };

    struct kitap teknikKitaplar[3];


    int i=0;

    for (i=0; i<3; i++) {

        printf("%d. Teknik kitabin: \n", i+1);
        printf("Ismi: "); scanf("%s", teknikKitaplar[i].kitapIsmi);
        printf("Yazari: "); scanf("%s", teknikKitaplar[i].yazar);
        printf("Yayinevi: "); scanf("%s", teknikKitaplar[i].yayinevi);
        printf("Sayfa sayisi: "); scanf("%d", &teknikKitaplar[i].sayfaSayisi);
        printf("Basim Yili: "); scanf("%d", &teknikKitaplar[i].basimYili);
    }

    printf("KITAPLARIMIZ: \n\n");


    for (i=0; i<3; i++) {
        printf("%d. Kitab: \n", i+1);
        printf("Ismi: %s\n", teknikKitaplar[i].kitapIsmi);
        printf("Yazari: %s\n", teknikKitaplar[i].yazar);
        printf("Yayinevi: %s\n", teknikKitaplar[i].yayinevi);
        printf("Sayfa sayisi: %d\n", teknikKitaplar[i].sayfaSayisi);
        printf("Basim Yili: %d\n\n", teknikKitaplar[i].basimYili);



    }

}
Ubuntu Mate Trusty

Amenofis

Alıntı yapılan: ShangriLa - 29 Aralık 2015 - 20:54:46

Kitap structu icerisindeki char cinsinden olan pointerlerlar sadece bir karakteri point ediyor

Yanlışınız var hiçbirşeyi point etmiyor, tamamen illegal.

Sh4oTT

Alıntı yapılan: AmenofisAlıntı yapılan: ShangriLa - 29 Aralık 2015 - 20:54:46
Kitap structu icerisindeki char cinsinden olan pointerlerlar sadece bir karakteri point ediyor
Yanlışınız var hiçbirşeyi point etmiyor, tamamen illegal.
Nasıl yani hocam?  Yanlışmı tanımlamışım pointeri?

Amenofis

Alıntı yapılan: ShaoDownLiNuP - 30 Aralık 2015 - 09:30:06

Nasıl yani hocam?  Yanlışmı tanımlamışım pointeri?

struct kitap teknikKitaplar[3];

Bu bir yerel nesne (değişken). Yerel ve malloc ile alınmış nesnelerin içinde rastgele sayılar olur. int değişkenlerin içindeki değerler önemli değil, zaten üzerine yazıyorsun. Fakat işaretçi olan elemanların içindeki rastgele değerler rastgele adres demek. Bunları direkt kullanırsan rastgele adreslere yazmaya çalışır. Bunun sonucunu biliyorsun. O yüzden işaretçileri kullanmadan önce tuttuğu adresin geçerli olduğundan emin olmak zorundasın.

struct kitap a;
char kelime[] = "Ubuntu";

strcpy(a.yazar, kelime);
Hatalı. Karakter dizisi rastgele bir yere kopyalanamaz.

a.yazar = kelime;
a.yazar = "Linux";
Bunlar olur. Çünkü C' de iki tırnak içindeki stringler sadece bir adrestir, ilk karakterin adresi. Yani işaretçi geçerli bir adres tutmuş olur.

a.yazar = kelime;
a.yazar[0] = 'B';
Hatalı. Çift tırnak içindeki stringlerin üzerine yazılamaz, sadece okunabilir.

a.yazar = (char *) malloc( strlen(kelime) + 1); // Şimdi geçerli bir adres tutuyor.
strcpy(a.yazar, kelime);
a.yazar[0] = 'B';
Şimdi ok. Çünkü sadece okunabilir olan string, yazılabilir bölgeye kopyalandı.

Heralde ne yapılması gerektiği anlaşılmıştır.  ;)

Sh4oTT

@Amenofis, hocam cok teşekkür ederim. Bu stringler kafamı cok karıstırıyor :S

lnxdev

Alıntı yapılan: ShaoDownLiNuP - 30 Aralık 2015 - 16:12:41
@Amenofis, hocam cok teşekkür ederim. Bu stringler kafamı cok karıstırıyor :S

C zaten stringler için pek kullanışlı bir dil değil maalesef.

ShangriLa

Alıntı yapılan: Amenofis - 29 Aralık 2015 - 21:27:37Yanlışınız var hiçbirşeyi point etmiyor, tamamen illegal.

Evet aynen öyle o cümleyi bir türlü kuramadım, elinize sağlık ayrintılı anlatım için.
Ubuntu Mate Trusty