Re: [Linux-programlama] C ile Komple Cümleyi Almak

---------

New Message Reply About this list Date view Thread view Subject view Author view Attachment view

From: Nejat AYDIN (nejataydin@superonline.com)
Date: Thu 05 Jan 2006 - 05:13:40 EET


Alper KANAT wrote:
> Merhaba,
>
> Ufak bir proje için C'de bir program yazmam gerekiyor. Kullanıcının
> girdiği bir cümleyi bir array'in içine koymak istiyorum. scanf boşluk
> karakterini almadığı için benim için sorun oluyor. gets kullandığımda
> nedense program giriş almadan sonlanıyor.

Asla ve asla gets kullanma. ASLA!

> Bana birşey önerebilir misiniz ? scanf'in [^]0-9-] gibi bir seçeneği var
> ama bunu uygun bir şekilde ayarlayamadım.
>
> Bir de ben bir struct yapısı kurmuştum. Şöyle:
>
> struct bookinfo
> {
> char name[100];
> char author[100];
> char publisher[100];
> char isbn[100];
> };
>
> bunu şu şekilde tanımlarsam:
>
> struct bookinfo
> {
> char *name;
> char *author;
> char *publisher;
> char *isbn;
> };
> scanf ile değer almaya kalktığımda parçalama arızası veriyor.

Büyük ihtimalle işaretçilerin doğru yere işaret etmiyorlardır
veya hiç yer ayırmamışsındır.

> Direk
> atama yaparsam kabul ediyor.
> Bu 2 sorunla ilgili yardıma ihtiyacım var, teşekkür ederim..

En basitinden şöyle bir fonksiyon yazabilirsin. Fonksiyonda
her bir alanın farklı bir satırda girildiği kabul ediliyor.

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

struct bookinfo
{
     char name[100];
     char author[100];
     char publisher[100];
     char isbn[100];
};

int read_bookinfo (struct bookinfo *bi)
{
     char *p;

     if (fgets(bi->name, sizeof bi->name, stdin) == NULL)
         return 0;
     if ((p = strchr(bi->name, '\n')) == NULL)
     /* Too many character entered or EOF encountered before \n */
     {
         /* discard the rest of line */
         int c;
         while ((c = getchar()) != EOF && c != '\n');
     }
     else
         *p = '\0';

     if (fgets(bi->author, sizeof bi->author, stdin) == NULL)
         return 0;
     if ((p = strchr(bi->author, '\n')) == NULL)
     /* Too many character entered or EOF encountered before \n */
     {
         /* discard the rest of line */
         int c;
         while ((c = getchar()) != EOF && c != '\n');
     }
     else
         *p = '\0';

     if (fgets(bi->publisher, sizeof bi->publisher, stdin) == NULL)
         return 0;
     if ((p = strchr(bi->publisher, '\n')) == NULL)
     /* Too many character entered or EOF encountered before \n */
     {
         /* discard the rest of line */
         int c;
         while ((c = getchar()) != EOF && c != '\n');
     }
     else
         *p = '\0';

     if (fgets(bi->isbn, sizeof bi->isbn, stdin) == NULL)
         return 0;
     if ((p = strchr(bi->isbn, '\n')) == NULL)
     /* Too many character entered or EOF encountered before \n */
     {
         /* discard the rest of line */
         int c;
         while ((c = getchar()) != EOF && c != '\n');
     }
     else
         *p = '\0';

     return 1;
}
_______________________________________________
Linux-programlama mailing list
Linux-programlama@liste.linux.org.tr
http://liste.linux.org.tr/mailman/listinfo/linux-programlama


New Message Reply About this list Date view Thread view Subject view Author view Attachment view

---------

Bu arsiv hypermail 2.1.2 tarafindan uretilmistir.