C Programı Çalısma Hatası Yardım

Başlatan Sh4oTT, 30 Aralık 2016 - 00:14:29

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

Sh4oTT

Aşagıdaki kodu çalıştırdığım zaman çalışma zamanı hatası alıyorum. Scanf mi sorun cıkarıyor acaba?



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



struct data{


char * ad = NULL;
char * soyad = NULL;
int tc = 0;

data * next;
data * prev;

};


int main() {

data * root = (data *) malloc (sizeof(data));

char * ad2 = NULL;
char * soyad2 = NULL;
int tc2 = 0;

printf("Ad: "); scanf("%s", &ad2);
printf("Soyad: "); scanf("%s", &soyad2);
printf("Tc: "); scanf("%d", &tc2);

root->ad = ad2;
root->soyad = soyad2;
root->tc = tc2;

printf("Ad: %s\nSoyad: %s\nTc: %d\n\n", root->ad, root->soyad, root->tc);

}






Aşağıdaki gibi çalıştırdıgım zaman sıkıntı çıkmıyor.



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



struct data{


char * ad = NULL;
char * soyad = NULL;
int tc = 0;

data * next;
data * prev;

};


int main() {

data * root = (data *) malloc (sizeof(data));

char * ad2 = NULL;
char * soyad2 = NULL;
int tc2 = 0;

/*printf("Ad: "); scanf("%s", &ad2);
printf("Soyad: "); scanf("%s", &soyad2);
printf("Tc: "); scanf("%d", &tc2);

root->ad = ad2;
root->soyad = soyad2;
root->tc = tc2;
*/


root->ad = "Ali";
root->soyad = "Ak";
root->tc = 123;

printf("Ad: %s\nSoyad: %s\nTc: %d\n\n", root->ad, root->soyad, root->tc);

}


Amenofis

C öğrenen herkes bu hatayı mutlaka yapar. 

ad2 ve soyad2 nereyi gösteriyor? NULL, yani 0. scanf'e diyorsun ki aldığın karakterleri 0. adresten başlayarak kopyala. O da bu isteğini işletim sistemine iletiyor. Sistem diyor ki 0 sayısı ile adresleme yapılamaz, 0'dan başka bir sayı olması lazım. Aldığın hata sistem tarafından reddedildiğini gösteriyor.

Ben hatayı söyledim, çözümünü sen bul.

Erdem

#2
Ya da şu şekilde işlevler yazabilirsin. Gösterge ve malloc kullanarak yapmak istersek. Ama yazdığın programda free ile dinamik olarak tahsis edilen bellek alanını geri vermek gerekiyor. Aksi halde bellek sızıntısı oluşuyor.

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

struct ogrenci
{
    char * isim;
    char * soyIsim;
    int harfSayisi;
};

void bilgiAl(struct ogrenci *);
void bilgiHazirla(struct ogrenci *);
void temizle(struct ogrenci *);
void bilgiGoster(struct ogrenci *);

int main(void)
{
    struct ogrenci ilkOgrenci;
    bilgiAl(&ilkOgrenci);
    bilgiHazirla(&ilkOgrenci);
    bilgiGoster(&ilkOgrenci);
    temizle(&ilkOgrenci);
    return 0;
}

void bilgiAl(struct ogrenci * ogrenci)
{
    char gecici[81];
    printf("Lütfen isminizi giriniz.\n");
    gets(gecici);
    // ismi tutmak için bellek alanı ayır
    ogrenci->isim = (char *) malloc(strlen(gecici) + 1);
    // ismi ayrılan bellek alanına kopyala
    strcpy(ogrenci->isim, gecici);
    printf("Lütfen soyadınızı giriniz.\n");
    gets(gecici);
    ogrenci->soyIsim = (char *) malloc(strlen(gecici) + 1);
    strcpy(ogrenci->soyIsim, gecici);
}

void bilgiHazirla(struct ogrenci * ogrenci)
{
    /* ... */
}

void temizle(struct ogrenci * ogrenci)
{
    free(ogrenci->isim);
    free(ogrenci->soyIsim);
}

void bilgiGoster(struct ogrenci * ogrenci)
{
    /* .. */
}


Bazı kısımları boş bıraktım. O kısımları da siz doldurun. Program çalıştığında şu çıktıyı versin.

Alıntı YapLütfen isminizi giriniz.
Ali
Lütfen soyadınızı giriniz.
Veli
Merhaba Ali Veli, isminizde 7 harf var.




Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 30 Aralık 2016 - 21:20:16

Bu programı bir de D ile kodladım. D bilenler için C  ile kod yazmak biraz amelelik gibi gelebilir.  ;)

Ayrıca kodun ne kadar temiz olduğuna dikkat edin. Uzunluk işlevi kullanıcının Türkçe karakter girdiği zaman uzunluğu doğru göstermesi için orada. Ayrıca  uzunluk(this.ad) yerine this.ad.uzunluk şeklinde işlevi çağırabildiğimize dikkat edin. Buna denk işlev çağırma UCFS deniyor.

https://tour.dlang.org/tour/en/gems/uniform-function-call-syntax-ufcs

import std.stdio;
import std.conv;
import std.string: strip;

size_t uzunluk(string kelime)
{
    auto uzunluk = 0;
    foreach (dchar karakter; kelime)
        ++uzunluk;
    return uzunluk;
}

struct Öğrenci
{
    this(string ad, string soyad)
    {
        this.ad = ad;
        this.soyad = soyad;
        this.harfSayısı = this.ad.uzunluk + this.soyad.uzunluk;
    }
    string ad;
    string soyad;
    size_t harfSayısı;

    string toString() const
    {
        string bilgiler;
        bilgiler ~= "Merhaba " ~ this.ad ~ " " ~ this.soyad ~ ",";
        bilgiler ~= " isminizde " ~ to!string(this.harfSayısı) ~ " harf var";
        return bilgiler;
    }
}

void main()
{
    writeln("Lütfen isminizi giriniz.");
    auto ad = strip(readln());
    writeln("Lütfen soyadınızı giriniz.");
    auto soyad = strip(readln());
    auto öğrenci1 = new Öğrenci(ad, soyad);
    writeln(*öğrenci1);
}