大学の課題でCLionを使っていたところ、EOFで詰まったのでメモ書き。
解決法は最後に書いているので飛ばしたい人は飛ばしてください。
起こった問題
問題の概要
//(大分省略して書きます)
while(Scanf("%d",&i)!=EOF){
printf("%d",i);
}
本来このコードを実行してctrl+d
またはctrl+Z
キーを入力すると、scanf()
がEOF(通常は-1)
を返して上記のwhile文が終了するはず。
しかし、CLionのコンソール上で実行すると、scanf()
がEOFではなく0を返すという謎現象に悩まされた。
外部からコマンドプロンプトでEXEファイルを実行した時には問題は発生しなかった。
環境
OS: Windows 11
エディター: CLion 2022.1.1 Build #CL-221.5591.52 (JetaBrains)
コンパイル設定:
Configuration: CMake Application
CMakeでMinGWを指定し、MinGWでビルド
問題の詳細
#include <stdio.h>
int main() {
int x;
int r;
while ((r = scanf("%d", &x)) != EOF) {
printf("INPUT: %d\n", x);
printf("scanf returned %d\n", r);
}
printf("END");
}
このコードを実行してCtrl+D
を入力した結果がこちら。
キーを入力した直後から、scanf
が0を吐いて暴走をし始めたことが確認できる。
ちなみに、Ctrl+Z
では何も反応なく。Keymapを確認したところ、EOFを送るショートカットはCtrl+D
に割り振られていたのでキーは間違えてはなさそう。
生成されたexeファイルをコマンドプロンプトから実行すると、Ctrl+Z
で問題なく正常にscanf()
がEOFを吐いた。
エディター外のコンソールを呼び出しても良いが極力CLionで完結させたい、ということで試行錯誤した。
解決法: MinGWからCygwinへ切り替えた
見出しの通りです。ビルドツールをMinGWからCygwinに切り替えたところ、しっかりCtrl+D
でEOFを吐いてくれました。行ったCygwinの設定は以下の通り。
Cygwinのインストールについては➣公式ヘルプを参照のこと。以下のパッケージを追加しておくと良いかと思います。
- gcc-g++
- gdb
- gdb-debuginfo (Tutorialには載っていないが、Debuggerを有効にするらしい➣StackOverflowの記事)
CMake設定がCygwinに切り替わっているか確認することを忘れずに。
結局問題なのは?
CLionのバグかと。コンソールがMinGWに対応しきれていなかったという話なのでしょうか..?わからん。
独り言
まさか大学の課題で2年ぶり(?)にQiitaに投稿するとは思わなかったが、意外とすぐに書けちゃうなって思いました。今後投稿回数を増やせるように心がけます..!