問題的發現:(想要看干貨可以直接跳過這段)
我最近剛了解到關於棧的用法,於是按照參考書尋找代碼,並把它敲到電腦上。編譯運行代碼后發現無法終止,在網上查找各種資料,總結如下。
因為我的電腦是Windows和Mac雙系統的所以都試了一遍。
Windows端:
在(Visual Studio 2019/Dev c++/CodeBlocks)上編譯運行后可以用ctrl+z終止並可以顯示出最后結果;編譯后的exe文件按住ctrl+z后程序會直接退出,連顯示都沒有。
以下是在編譯器下運行的結果:
在clion上編譯運行按ctrl+z沒有用,編譯后的exe程序也是會直接退出。
解決辦法:
前三種在編譯器里都可以運行,在編譯后的exe文件如果要想使用可以在程序里(主函數里int main() )加入system("pause");
#include <stdio.h> int main() { 你要寫的代碼 while(scanf("%d",&n)!=EOF) { ..... } system("pause"); //這一步至關重要 }
效果如下:
CLion的情況就比較麻煩,但也有解決辦法
如果你編的是C語言:(規避CLion的bug)
#include <stdio.h> int main() { 你的代碼... while(scanf("%d",&n)!=EOF) { ..... if (getchar() == '\n') //這一步至關重要 { break; } } return 0; }
如果編譯完效果如下:
但是編譯完的exe文件,運行后還是會直接退出這時就應該在程序里(主函數里int main() )加入system("pause");
#include <stdio.h> int main() { 你的代碼... while(scanf("%d",&n)!=EOF) { ..... if (getchar() == '\n') { break; } } system("pause"); //這一步至關重要 return 0; }
編譯后效果如下:
如果你編的是C++語言:(規避CLion的bug)
#include <bits/stdc++.h> using namespace std; int main() { 你的代碼... while(cin>>n) { ..... if (cin.get() == '\n') //這一步至關重要 { break; } } return 0; }
cin是終端輸入,也被稱之為標准輸入(standard input),cin的主要功能就是從標准輸入讀入一個值。當從鍵盤上輸入一串字符並按回車后,這些字符會首先被送到輸入緩沖區中存儲。每當按下回車鍵后,cin.get()就會檢測緩沖區中是否有了可讀的數據。
效果如下:
同樣編譯完的exe文件,運行后還是會直接退出這時就應該在程序里(主函數里int main() )加入system("pause");
#include <bits/stdc++.h> using namespace std; int main() { 你的代碼... while(cin>>n) { ..... if (cin.get() == '\n') { break; } } system("pause"); //這一步至關重要 return 0; }
效果和C同樣就不展示了。
Mac端:
Xcode:無論是在Xcode編譯運行,還是在它編譯后的文件上運行按住ctrl+d都可以運行。
效果如下:
CLion:在程序上按ctrl+d進程會直接結束,但是在它編譯后的程序運行會顯示正確結果
效果如下:
解決辦法:
Xcode在Mac上的表現接近完美。
CLion可以在參考Windows上的解決辦法,在while里插入if語句;或者直接在調試(Debug)里運行。