PDA

Tam Sürümünü Görmek İçin : C'de Scanf ile String Okuma


asinanyavuz
22/09/2005, 14:18
Klasik bir sorudur. Ama nasıl arayacağımı bilemediğim için sorma gafletinde bulunuyorum.

C de hepinizin bildiği üzere scanf ile string okurken scanf fonksiyonu ilk boşluktan sonrasını okumuyor. Buna karşılık olarak neler yapılabilir? Fakat girilecek kelime sayısı da bilinmediği varsayılırsa..

Örnek:
Kullanıcıdan adı soyadı bilgisini istiyoruz. Ama kullanıcının kaç ismi olduğunu bilemiyoruz.
sayın ahmet sinan yavuz
ahmet sinan yavuz
sinan yavuz
sinan
dört girdinin de başarılı bir şekilde alınmasını ve görüntülenmesini/saklanmasını özetle değişkene TAM olarak atanmasını nasıl sağlarım?

Şimdiden çok teşekkürlerimi sunarım...
Başınızı ağrıttım kusura bakmayınız...
Saygılarımla...


nilsonmandela
22/09/2005, 14:32
scanf fonksiyonunda ısrarcı olmayıp gets() fonksiyonunu deneyebilirsin.

acehreli
22/09/2005, 18:53
asinanyavuz, scanf'in ilk bosluktan sonrasini okumadigi dogru degil. Duzen dizgisindeki bir bosluk karakteri bir veya daha fazla bosluk karakterinin (TAB, vs. dahil) okunup gozardi edilmesini saglar:


#include <stdio.h>

/* IMDAT! Acaba bu yeterli mi? */
#define DIZGI_UZUNLUGU 10000

int main()
{
char ad[DIZGI_UZUNLUGU];
char soyad[DIZGI_UZUNLUGU];

scanf("%s %s", ad, soyad);
printf("Okudum: %s %s\n", ad, soyad);

return 0;
}


nilsonmandela'nin onerisi "satiri butunuyle oku" olarak anlasilmali; yoksa gets'i de girdinin uzunlugunu bilmedigimiz icin guvenli olarak kullanamayiz. gets yerine fgets kullanilmasi onerilir; cunku onda hic olmazsa okumayi dizginin uzunlugu ile sinirlayabiliriz. Tabii bu sefer de butun girisi okuyamamis olma gibi bir sorun vardir. Zor... :)


#include <stdio.h>

/* IMDAT! Acaba bu yeterli mi? */
#define DIZGI_UZUNLUGU 10

int main()
{
char satir[DIZGI_UZUNLUGU];

fgets(satir, DIZGI_UZUNLUGU, stdin);
printf("En fazla %d karakter okudum: %s\n",
DIZGI_UZUNLUGU - 1, satir);

return 0;
}


Butun satiri okuduktan sonra, satiri taramak icin strtok islevi yararli olabilir.

Dizginin disina tasma sorunu scanf'te de vardir; ama onda da giristen okunan karakterleri kisitlayabiliriz.

Bu gibi sorunlar C++'in std::string'inde yoktur. Bjarne Stroustrup C'nin bu tur gucluklerini ve C++'in getirdigi kolayliklardan bazilarini yazilarindan birisinde isler. Ben de Turkcelestirmistim:

http://acehreli.org/~ali/turkcecpp/cpp_ogrenmek.html

Ali

Euclides
22/09/2005, 19:54
Bu gibi sorunlar C++'in std::string'inde yoktur.
Ali
string'de sihirli bir çözüm göremedim
http://forum.ceviz.net/showthread.php?t=22521

C ile de böyle halledebilirsin. Evt realloc var fakat string'de de var ;)

int nCurrSize = 0x100;
int i = -1;
char c=0;
char *szName;
szName = malloc(nCurrSize);
c = getchar();
while(c!=10)
{
i++;
if(i >= nCurrSize)
{
nCurrSize += 0x100;
szName = realloc(szName,nCurrSize);
}
szName[i] = c;
c = getchar();
}

asinanyavuz
24/09/2005, 10:29
Çok teşekkür ederim... Fgets ve gets fonksiyonlarını kullanmak aklımın ucundan bile geçmemişti nedense...
Çok saolun... :super: