Selamlar,
Öncelikle konuyu dağıtmadan soruya cevap veriyim. Standart C fonksiyonları
ile kontrollerin yapıldığı wrapper fonksiyonlar yazarsanız bütün
problemleriniz ortadan kalkıyor:
#include <stdio.h>#include <stdlib.h>#include <errno.h>
#define TRUE 1#define FALSE 0
void flushStdin() {
int chr = 0;
while ((chr = fgetc(stdin)) != EOF && chr != '\n'){
/*NULL Body*/;
}
return;}
int obtainString (char *message, char *input, int inputSize) {
unsigned int i = 0;
unsigned int total = 0;
int chr = 0;
if (input == NULL) {
return -1;
}
if (inputSize < 2) {
input[0] = '\0';
return -1;
}
if (message != NULL) {
fprintf(stdout, "%s", message);
}
fflush(stdout);
inputSize--;
while (TRUE) {
chr = fgetc(stdin);
if (chr == '\n' || chr == EOF) {
break;
}
if (i < inputSize) {
input[i] = chr;
i++;
}
total++;
}
input[i] = '\0';
return total;}
long int obtainInteger() {
char input[32];
char *end;
long int result;
obtainString(NULL, input, sizeof(input));
errno = 0;
result = strtol(input, &end, 10);
if (errno != 0 || *end != 0 || end == input) {
return -1;
}
else {
return result;
}}
int main(){
char in[15] = {'\0'};
int number= 0;
char out[] = "String gir:";
printf("Sayı gir:");
scanf("%d", &number); //-O2 parametresi ile derlenirse return
value'ya bakmadığımız için compile sırasında warning verebilir.
Problem değildir.
printf("Girdiğin sayı: '%d'\n", number);
flushStdin(); //Eğer programda illaki scanf kullanmak gerekirse,
stdin buffer'ını temizlemek için bu fonksiyon kullanılabilir. Bu satır
comment edilip derlendiğinde birsonraki obtainString fonksiyonunun
kullanıcıyı beklemeden pas geçtiğini görebilirsin.
number = obtainString(out, in, sizeof(in)); //kullanıcıdan string
okumak için kullanılan fonksiyon
printf("Girdiğin string: '%s'\n", in);
printf("Sayı gir:");
number = obtainInteger(out, in, sizeof(in)); //kullanıcıdan
integer okumak için kullanılan fonksiyon
if (number == -1) {
printf("Hatalı sayı girişi yaptın!\n");
}
else {
printf("Girdiğin sayı: '%d'\n", number);
}
return 0;}
Şimdi diğer yorumlara cevap veriyorum:
13 Nisan 2012 10:21 tarihinde Efe Gürkan YALAMAN <[email protected]>yazdı:
>
> Scanf ten once fflush(stdin); koymak ve scanf yerine getchar ile tek
> karakter almayi deneyebilirsiniz.
>
fflush(stdin) tamamen yanlış bir komuttur:
int fflush(FILE *ostream);
ostream *points to an output stream* or an update stream in which the
most recent operation was not input, the fflush function causes any
unwritten data for that stream to be delivered to the host environment to
be written to the file; *otherwise, the behavior is undefined.*
Daha detaylı bilgi için google'da "why fflush(stdin) is wrong?" diye
aratınız. Bu birçok kişinin işe yaradığını düşündüğü fakat genel yanlış
kullanımı olan bir komuttur c'de.
13 Nisan 2012 00:16 tarihinde Husrev Ozayman <[email protected]> yazdı:
>
> C'de bir yığın gariplik var. Say say bitmez. C öğrenmenize sebep olan
> şey nedir bilmiyorum ama C++ da ihtiyaçlarınız karşılıyorsa bence C
> öğrenmeyin. Ben okulda öğrendim, sonra okulda c++ öğrendim, çok kötü
> hissettim açıkçası. Onca uğraş dur saçma sapan scanf'lerle,
> malloc'larla, sonra gelsin cin'ler, new'ler...
>
> C yerine C++ ile geliştirirseniz daha uzun yaşarsınız gibime geliyor.
> Benden bir küçük kardeş tavsiyesi.
>
C ile *embedded ortamlar dahil* yapılamayacak hiç birşey yoktur. Peki diğer
diller? O yüzden her dil ölür, c yaşar ! (IMHO).
yukarıdaki örneğimdeki gibi kendi fonksiyonlarınızı kullanırsanız scanf vs
gibi bahsettiğinniz fonksiyonlarla uğraşmanıza gerek kalmaz.
malloc vs ile uğraşmak istemiyo musunuz? Try GLib :)
13 Nisan 2012 15:07 tarihinde hal 2000 hal <[email protected]> yazdı:
>
> Muhtemelen hem zorlanmanızın hemde bunları çok farklı diller olarak
> görmenizin altında yatan neden, C++ ile object oriented programming
> (OOP) bağdaştırmanızdan ileri geliyor.
> Eğer C ile OOP tekniklerini kullanmış iyi dizaynlar yapmış olsaydınız.
> C++'ı farklı bir dil değil sadece extra keyword'lar olarak
> görecektiniz.
>
Hocam tebrikler:) Söylemek istediklerimin çoğunu siz söylemişsiniz.
13 Nisan 2012 15:47 tarihinde Husrev Ozayman <[email protected]> yazdı:
>
> Okunurluk açısından felaket.
> Yazılırlık açısından başarısız.
>
Kişiden kişiye değişir bence bu.
Type-safe değil.
>
>
C Programmers: "We know what we do™" :)
> Veri türlerinin boyutları bile derleyicinin insafına kalmış.
>
Bu tam tersine bir avantajdır:
http://en.wikipedia.org/wiki/C_data_types adresinden alıntı:
*The actual size of integer types varies by implementation. The only
guarantee is that the long long is not smaller than long, which is not
smaller than int, which is not smaller than short. Also, int should be the
integer type that the target processor is most efficient working with. This
allows great flexibility: for example, all types can be 64-bit. However,
only several different integer width schemes (data models) are popular and
since data model defines how different programs communicate, a uniform data
model is used within a given operating system application interface.*
Aynı zamanda işlemci yeteneğine göre değilde memory yeteneğine göre
ayarlanmış veri türleri de vardır:
http://en.wikipedia.org/wiki/C_data_types adresinden alıntı:
*The C language provides the separate types size_t and ptrdiff_t to
represent memory-related quantities. Existing types were deemed
insufficient, because their size is defined according to the target
processor's arithmetic capabilities, not the memory capabilities, such as
available address space. Both of these types are defined in the stddef.hheader (
cstddef header in C++).*
Aynı zamanda boyutları garanti edilmiş değişkenlerde C'de vardır:
http://en.wikipedia.org/wiki/C_data_types adresinden alıntı:
*The C99 standard includes definitions of several new integer types to
enhance the portability of programs[2]. The already available basic integer
types were deemed insufficient, because their actual sizes are
implementation defined and may vary across different systems. The new types
are especially useful in embedded environments where hardware supports
usually only several types and that support varies from system to system.
All new types are defined in inttypes.h header (cinttypes header in C++)
and also are available at stdint.h header (cstdint header in C++).*
**
Sevgiler Saygılar Herkese.
-engin
_______________________________________________
Linux-programlama mailing list
[email protected]
https://liste.linux.org.tr/mailman/listinfo/linux-programlama
Liste kurallari: http://liste.linux.org.tr/kurallar.php