Standart bir C işlevi olarak dahil edilmek üzere, getch'in doğal olarak ulaşılmaz kılan nedir?Neden getch taşınabilir değil?
Konsol arabirimleri için çok sezgisel ve zarif. Bu olmadan, tek bir karakter istemek her zaman yanıltıcıdır çünkü kullanıcılar birden fazla tuşa girebilir.
Daha da kötüsü, genellikle standart bir özellik olarak sağlanmayan, konsol girişini okuduktan sonra standart girişi temizlediğinizden emin olmanız gerekir! Kendi başımı kullanmalıyım!
Basit bir program olabilir ki:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <conio.h>
int main(int argc, char **argv)
{
while (1) {
char yes_or_no;
printf("is this statement correct? 1 + 1 = 2(Y/N) $ ");
yes_or_no = tolower(getch());
switch (yes_or_no) {
case 'y':
puts("Right!");
goto done;
case 'n':
puts("\nhint> Please just say yes for the sake of this demo...");
break;
case 'q':
puts("\nExitting.");
goto done;
case EOF:
puts("\nEOF.");
goto done;
default:
printf("\nunknown response '%c'.\n", yes_or_no);
break;
}
}
done:
return 0;
}
olur:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
static inline void flush_stdin()
{
char ch;
do {
ch = getchar();
} while ((ch != '\n') && (ch != EOF));
}
int main(int argc, char **argv)
{
while (1) {
char yes_or_no;
printf("is this statement correct? 1 + 1 = 2(Y/N) $ ");
yes_or_no = tolower(getchar());
switch (yes_or_no) {
case 'y':
puts("Right!");
goto done;
case 'n':
puts("hint> Please just say yes for the sake of this demo...");
break;
case EOF:
puts("EOF.");
goto done;
default:
printf("unknown response '%c'.\n", yes_or_no);
break;
}
flush_stdin(); /* remove this to see the difference */
}
done:
return 0;
}
ben basit portatif konsol programı yapmak istiyorum her zaman, böyle fonksiyonların bir demet yapma zorla hissediyorum ve hala getch gibi istediğim her şeye sahip olmayacağım.
Elbette küfürleri kullanabilirsiniz, ancak küfürler tüm konsolunuzu ele geçirir ve programınızın normal bir kullanıcının beklediğinden farklı bir şekilde davranmasını sağlar (programın yalnızca kaydırılması ve programın çalıştırıldığı komutu göstermesi için konsol tamponu).
"Neden" in kötü bir soru olduğunu (her zaman neyin tercih edilmesi gerektiğini) biliyorum, ama sorulmalı. Bir masaüstü sisteminin destekleyemediği bir getch içinde doğal olarak ulaşılmaz bir şey var mı? Eğer yoksa, kendim yazabilirim ve desteklemek istediğim tüm platformlara taşıyabilirim ve iyiyim.
Eğer getch bir şey varsa, bu bir masaüstü sistem tarafından desteklenemez mi, ne var? Bu yüzden, conio'nun niçin kullanıldığını anlamak için daha iyi bir nedenim var: "sadece ncurses/conio standart değil".
Btw, '' '' int' türünde olmalıdır. – pzaenger
Biçimlendirilmiş I/O ('scanf' /' printf') ve biçimlendirilmemiş I/O ('getchar' /' putchar') karışımından kaçınmaya çalışırsanız, buna bile gerek yoktur. – edmz
@pzaenger Biliyorum, ama bunu EOF ile karşılaştırmayı geçersiz kıldım çünkü bunu sadece 1 bayt yerine 4 bayt ile karşılaştırıp ek bir cast ekleyeceğim. Bu yaygın bir hatadır. -black: ve bu detay açık değildir ve daha kullanıcı dostu kütüphane tasarımı ile önlenebilecek ince hatalara neden olur. – Dmitry