getch・getcheに関するめも(Mac/Unix用) 追記4/12(キーボード入力まわりについて)
とあるプログラムをCで書いてたら
#include <conio.h> getch()
の部分でconio.hがないよと怒られる。
他の手立てもあるらしいが、あんまり難しいことを考えたくないため、どうにかできないか検索
僕「なーんだ、もうあるじゃんw簡単簡単w」
と言っていたのも束の間、includeフォルダにgconio.hを移動できない
su使って移動させればええやろ!と思ったが、それでもPermission deniedされる。
(ちなみにsuを有効化するのも1手順必要だった
Mac でルートユーザを有効にする方法やルートパスワードを変更する方法 - Apple サポート
)
おかしいなと思いつつ調べるとusr以下は最近のアップデートでルートユーザーでもアクセスできなくなっている模様
rootlessとかいうやつで。
やばくないですか?(やばくはない)
というわけで解除しました
これの通りにやればOKです。
ただ、rootlessはマルウェアからの防衛的な意味もあるようなので
作業が終わった同じ手順でcsrutil disableの部分を
csrutil enable
というコマンドにして有効化しておきましょう。
終わり。
追記4/12
・kbhitについて
#include <stdio.h> #include <conio.h> int main(){ int key; int flag = 1; while(flag){ if(_kbhit()){ 処理1 flag = 0; } } }
キーボード入力がヒットする→キーボード入力があると処理をするような関数
これもMacにはデフォルトでないみたいです、上のヘッダファイルにもありませんでした。
そこでここ参照
解決
・矢印キーの入力について
特殊入力はなんか色々特殊らしい、安直に調べたやつではうまく認識できなかった
Console Operation for RT-Series
結局ここで解決した。以下例文(unix用)インデントおかしいけど許して
#include <stdio.h> #include <gconio.h> #include <termios.h> #include <unistd.h> #include <fcntl.h> int kbhit(void) { ~略~ } return 0; } int main(){ switch(getche()) { case 0x1b: switch(getche()) { case 0x5b: switch(getche()){ case 0x41: printf("↑\n"); break; case 0x42: printf("↓\n"); break; case 0x44: printf("←\n"); break; case 0x43: printf("→\n"); break; } } break; } return 0; }