祭囃子は遠く、

理系大学生のハッピーエヴリディを書いていきます。

getch・getcheに関するめも(Mac/Unix用) 追記4/12(キーボード入力まわりについて)

とあるプログラムをCで書いてたら

#include <conio.h>
getch()

の部分でconio.hがないよと怒られる。

調べるとmac(というかunixには実装されてない模様)

他の手立てもあるらしいが、あんまり難しいことを考えたくないため、どうにかできないか検索

nonberanai.blog.fc2.com

僕「なーんだ、もうあるじゃんw簡単簡単w」

と言っていたのも束の間、includeフォルダにgconio.hを移動できない

su使って移動させればええやろ!と思ったが、それでもPermission deniedされる。

(ちなみにsuを有効化するのも1手順必要だった
Mac でルートユーザを有効にする方法やルートパスワードを変更する方法 - Apple サポート

おかしいなと思いつつ調べるとusr以下は最近のアップデートでルートユーザーでもアクセスできなくなっている模様

rootlessとかいうやつで。

やばくないですか?(やばくはない)

というわけで解除しました

qiita.com

これの通りにやれば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にはデフォルトでないみたいです、上のヘッダファイルにもありませんでした。

そこでここ参照

tricky-code.net

解決

・矢印キーの入力について
特殊入力はなんか色々特殊らしい、安直に調べたやつではうまく認識できなかった

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;
}