Thread overview
Basit bir c programı
Mar 30, 2018
Serdar
Mar 31, 2018
Serdar
March 30, 2018

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

int main(){

	printf("Kac yasindasin?\n");
	scanf("%d");

	printf("Kac kardessin?\n");
	scanf("%d");

	printf("Hangi sehirde yasiyorsun?\n");
	scanf("%d");

	printf("Yasadigin sehir hakkinda ne dusunuyorsun?\n");
	scanf("%d");

	getch();
}

kendi kendime takılırken şöyle bir şey yapayım dedim sayı yazdığım zaman sorunsuz baştan aşağı işliyor ama yazı yazdığım zaman örnek olarak 18 değilde onsekiz yazdığımda diğer soruları arka arkaya soruyor ve hangi sehirde yasiyorsun sorusundan sonra diğer soru geliyor ama scanf fonksyonu işe yaramıyor ? nerelerde hata yaptığımı bulamadım ve nasıl düzeltebilirim ? şimdiden teşekkür ederim :)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

March 30, 2018

Tamsayı olarak kullanılamayan karakterler girişte durmaya devam ediyor. Standart giriş hata duruma geçiyor ve artık işlemiyor. C gibi her ortamı destekleyen dillerde girişi o durumdan çıkartmanın standart bir yolu yok.

Bir yöntem, soruyu sormadan önce girişteki bütün karakterleri okumak ve gözardı etmektir.

O yüzden, belki de en iyisi hep tek satır okumak ve o satırı dönüştürmeye çalışmak... diyeceğim ama sanırım tek satır okumanın da C'de standart bir yolu yok. getline() var ama o da POSIX.1-2008'e aitmiş. Şunun gibi bir şey yapmak gerekiyor:

#define _POSIX_C_SOURCE 200809L
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <assert.h>

int tamsayi_oku(const char * soru) {
   while (1) {
       printf("%s ", soru);
       char *satir = NULL;
       size_t uzunluk = 0;

       errno = 0;
       ssize_t adet = getline(&satir, &uzunluk, stdin);
       if (adet == -1) {
           printf("HATA: Okuyamadim");
           if (errno != 0) {
               printf(" %s", strerror(errno));
           }
           printf("\n");
           exit(1);
       }

       if (uzunluk == 0 || !isdigit(satir[0])) {
           printf("Lutfen bir sayi girin\n");

       } else {
           errno = 0;
           long int sonuc = strtol(satir, NULL, 10);
           if (errno == 0) {
               return sonuc;
           }

           printf("Donusum hatasi: %s\n", strerror(errno));
       }

       free(satir);
   }

   assert(0);
}

int main(){
   int yas = tamsayi_oku("Kac yasindasin?");
   int kardes = tamsayi_oku("Kac kardessin?");

   printf("%d yasindasin ve %d kardesin var\n", yas, kardes);
   return 0;
}

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

March 31, 2018

yanıtınız için çok teşekkür ederim Ali Hocam üni. sınavına hazırlanıcam diye uzun bir süredir bakamıyorum bu tür şeylere pratiğin önemini bir kez daha anladım şu an çoğu terimi unutmuşum :) 2 farklı şey anladım şu anda 1. si c dilinde sadece tam sayılarla çalışabildiğimiz ki bu pek mantıklı gelmedi diğeride çağırdığım kütüphanelerle yapmak istediğim şey pek uyuşmuyor bu biraz daha mantıklı gibi verdiğiniz kodu Devc++ da çalıştırmayı denedim ama hata veriyor

ssize_t adet = getline(&satir, &uzunluk, stdin);

hata satırı bu ancak biraz daha basit anlatırsanız benim için daha yararlı olacak gibi :)
Tekrardan yanıtınız için teşekkür ederim

Serdar

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

March 31, 2018

Alıntı (Serdar):

>

c dilinde sadece tam sayılarla çalışabildiğimiz ki bu pek mantıklı gelmedi

Çünkü doğru değil. :) Bu programda bile tamsayıya dönüştürmeden önce karakterler kullanıldı. Dizgi gerektiren soruları programdan çıkarttım çünkü bilginin nerede depolanacağı, o belleğin ne zaman geri verileceği, vs. gibi konulara girmek istemedim. C ancak mecbur kalındığında kullanılması gereken bir dil.

Alıntı:

>

Devc++ da çalıştırmayı denedim ama hata veriyor

ssize_t adet = getline(&satir, &uzunluk, stdin);

hata satırı bu

Peki hata mesajı ne? :) Dediğim gibi, getline() standart bir işlev değil; yalnızca POSIX.1-2008 standardını destekleyen ortamlarda bulunuyormuş. Belki o ortamda da vardır da '#define _POSIX_C_SOURCE 200809L' diye değil de başka biçimde etkinleştiriliyordur. Bunlar hep tahmin çünkü hata mesajı belki de ssize_t'nin bilinmediğini söylüyordur. (?)

Alıntı:

>

ancak biraz daha basit anlatırsanız

Ne yazık ki C'de girişten tamsayı okumak bile bu kadar karmaşık bir şey. :/

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]