2013-10-20 92 views
2

在我的代码中,我无法初始化for循环初始化部分中的变量。 当我写这篇文章的代码:for循环初始声明错误

long unsigned int arr[3][3]; 
char str[50]; 
for(;gets(str);) 
{ 
    int temp=0; 
    for(int i,j,k=0; str[k]!='\0'; k++){ if(str[k]!=' ')temp=temp*10+(str[k]-48); 

编译器显示

error: 'for' loop initial declarations are only allowed in c99 mode 

我不知道这意味着什么, 但如果我写我的代码是这样的:

long unsigned int arr[3][3]; 
char str[50]; 
for(;gets(str);) 
{ 
    int temp=0; 
    int i,j,k=0; 
    for(; str[k]!='\0'; k++){ if(str[k]!=' ')temp=temp*10+(str[k]-48); 

它工作正常。 这是怎么回事?

+0

你确定你用C++编译? – 0x499602D2

+0

添加编译器选项-std = c99 – DuXeN0N

+0

您不处于C99变体模式。 –

回答

5

循环中声明的变量,比如

for (int i = 0; ...; ...) 

在C99标准是新的,而在更早的标准是不允许的。错误信息告诉你的是你的编译器设置为使用较早的标准进行编译,因此你不能在for语句中使用声明。

您必须从for语句中删除声明,或者在编译时告诉编译器使用更高版本的标准。如果您有GCC或叮当声,则可以通过添加标志-std=c99来告诉编译器使用更高版本。

2

您正在使用仅支持C89的编译器,或者编译器处于仅支持C89的模式。变量的声明必须在C89的块的开头。这在C99或C++中不再是限制。

更改为C99模式或将i,j,k的声明放在块的开头。你初始化它们的方式看起来不正确,你只初始化了k

for(;gets(str);) 
{ 
    int temp=0; 
    int i,j,k; 
    for(i=0,j=0,k=0; str[k]!='\0'; k++){ if(str[k]!=' ')temp=temp*10+(str[k]-48); 

并且不使用gets,这是危险的,使用fgets代替。

+0

不要'fgets()'用于从文件中读取? 我该如何在此使用? – Anklon

+0

@Anklon你可以使用'fgets'从'stdin'中读取 –

1

发生这种情况是因为您以前的代码不符合您编译代码的C标准。检查C(或C++)编译器的手册如何打开(如果可能)C99标准下的编译。对于GNU编译器,它是-std=c99开关。