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:
Forum Yazılımı : vBulletin v3.6.8, Copyright ©2000-2008, Jelsoft Enterprises Ltd.