我最近一直在努力学习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)
问题是,当通过网络传输源代码时,这种问题很容易消失......无论他的源代码是否有尾随换行符,您都可以轻松地以包含或排除换行符的方式复制副本。。