0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[CLion] scanfがEOFを吐かなくて詰まった話

Posted at

大学の課題で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でビルド

image.png
image.png

問題の詳細

#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を吐いて暴走をし始めたことが確認できる。
image.png

ちなみに、Ctrl+Zでは何も反応なく。Keymapを確認したところ、EOFを送るショートカットはCtrl+Dに割り振られていたのでキーは間違えてはなさそう。

image.png

生成されたexeファイルをコマンドプロンプトから実行すると、Ctrl+Zで問題なく正常にscanf()がEOFを吐いた。

エディター外のコンソールを呼び出しても良いが極力CLionで完結させたい、ということで試行錯誤した。

解決法: MinGWからCygwinへ切り替えた

見出しの通りです。ビルドツールをMinGWからCygwinに切り替えたところ、しっかりCtrl+DでEOFを吐いてくれました。行ったCygwinの設定は以下の通り。

Cygwinのインストールについては➣公式ヘルプを参照のこと。以下のパッケージを追加しておくと良いかと思います。

  • gcc-g++
  • gdb
  • gdb-debuginfo (Tutorialには載っていないが、Debuggerを有効にするらしい➣StackOverflowの記事)

image.png

CMake設定がCygwinに切り替わっているか確認することを忘れずに。
image.png

結局問題なのは?

CLionのバグかと。コンソールがMinGWに対応しきれていなかったという話なのでしょうか..?わからん。

独り言

まさか大学の課題で2年ぶり(?)にQiitaに投稿するとは思わなかったが、意外とすぐに書けちゃうなって思いました。今後投稿回数を増やせるように心がけます..!

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?