我最近一直在努力學習C ++,直到今天一直都很順利。 我正在嘗試建立一個非常簡單的應用程式,它基本上隻是要求使用者輸入一個數字,然後顯示該數字的階乘。
當我嘗試在Cygwin中編譯檔案(g ++ factorial.cpp -o fact)時,我收到以下警告"警告:檔案末尾沒有換行符"。 按照警告的說法,我在檔案的末尾添加了一個換行符并再次嘗試...結果完全相同。 無論我嘗試一個新行還是二十行,它似乎永遠不會編譯。
我在下面添加了簡單但仍未完成的檔案(除非想象它的末尾有一個空白行。這個noob無法在代碼視圖中顯示它):
#include
#include
using namespace std;
int getInput();
void displayFactorial(int);
int main()
{
int number = getInput();
displayFactorial(number);
return 0;
}
int getInput()
{
int userNumber;
bool okNumber;
while(okNumber == false){
cout <
cin >> userNumber;
if(userNumber >= 1 and userNumber <=10){
okNumber = true;
}
else{
cout <
}
}
return userNumber;
}
void displayFactorial(int number){
string displayString = number +"! =";
int total;
for(int i = 0; i<=number; i++){
//displayString +="
}
cout << displayString;
}
// File ended the line above this (with a new line. This line added by Martin so it shows)
如果它不是換行符,任何想法可能導緻該警告?
不确定導緻警告的原因,但在您(嘗試)進入循環之前不會将okNumber初始化為"false",是以while循環可能永遠不會運作。哦,也許這意味着你不會在displayFactorial()結尾處做<< endl
在重新編譯之前儲存檔案了嗎?
@Rudy Velthuis:缺少<< endl不是原因。看到這個。除了我使用之外呢?
@ Mr.T:我瘋狂猜測。 我這裡沒有安裝Cygwin編譯器。
FWIW,你有評論//displayString +="。這也是函數中的注釋,還是代碼?看起來像一個沒有終止的字元串文字。
哇,初始化okNumber實際上解決了這個問題。我真的不認為它會做任何事情,但它現在就像一個魅力。謝謝,魯迪!當我剛添加空格時,我的文本編輯器實際上并沒有儲存檔案,但是在我添加文本後也是如此。不 (另一方面,有沒有辦法可以将評論标記為已接受的答案?)
@Luke:你隻能接受答案作為答案。隻需自己釋出解決方案的答案,然後将其标記為答案。也許你的編輯器會将拖尾空格删除為不需要的空格。正如我已經問過:你使用哪種編輯器?
究竟是如何在檔案末尾添加換行符的?
Most Unix-based text editors will add a trailing newline automatically, but apparently
Notepad++ (which I've never used) doesn't.
The file doesn't need to end with a blank line (which would be represented as two newline
characters in a row), just a properly terminated one.
See if Notepad++ has a configuration option that tells it to automatically append a newline
when saving a file, or at least to ask whether you want to add one.
很好的解釋 - 我有同樣的問題,隻需使用寫字闆而不是記事本解決它:)
您所要做的就是等待新的C ++ 0x标準。源檔案末尾不再需要換行符。 (這花了40年?)
處理頭檔案時,這實際上是一個大問題。 但是大多數編譯器能夠在沒有額外空白行的情況下正常工作十年或更長時間。
首先,警告不會阻止程式編譯。
第二:你确定要編譯你正在編輯的檔案嗎?
我在我的大學裡做了一些教程,大多數初學者犯了這個錯誤。
如果你可以肯定地說你正在編譯你正在編輯的檔案,那麼它可能是由不同的新行設定引起的,但我認為這非常不可能。
你使用哪個編輯器/ IDE?
這個問題與你的C ++代碼無關;我幾乎可以保證你的程式中未初始化的布爾值不會導緻問題。這是源檔案本身的問題。"Hello,world"程式會産生相同的警告。
包含C ++源檔案的文本檔案由字元行組成,其中每行由行尾标記終止。在Unix中,是以在Cygwin中(使用預設設定),行尾标記是單個'
'(換行符,換行符)字元。 (Windows使用CR-LF對("
")。
文本檔案的最後一行可能不以換行符結尾,但g ++更喜歡正确終止它。
大多數基于Unix的文本編輯器會自動添加一個尾随換行符,但顯然Notepad ++(我從未使用過)不會。
該檔案不需要以空行結束(它将在一行中表示為兩個換行符),隻是一個正确終止的行。
檢視Notepad ++是否有一個配置選項,告訴它在儲存檔案時自動附加換行符,或者至少詢問是否要添加換行符。
(檔案末尾缺少的換行符可能是您在釋出問題時粘貼代碼時出現問題的原因。)
結果是沒有将布爾變量初始化為false是問題。但是,我不确定它是否實際上是問題的初始化,或者隻是文本編輯器可能實際上沒有儲存檔案的事實,如果你隻是在它的末尾添加空格。對于那些想知道的人,這在Notepad ++中發生在我身上。
也許這是一些看不見的角色的問題?我複制粘貼您的代碼并在沒有任何警告/錯誤的情況下編譯,在Cygwin下使用以下g ++:
$ g++ --version
g++ (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
問題是,當通過網絡傳輸源代碼時,這種問題很容易消失......無論他的源代碼是否有尾随換行符,您都可以輕松地以包含或排除換行符的方式複制副本。。