2

在我的代码中,我无法在 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);

它工作正常。为什么会这样?

4

3 回答 3

5

在循环中声明变量,例如

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

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

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

于 2013-10-20T14:24:21.017 回答
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改用。

于 2013-10-20T14:23:48.223 回答
1

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

于 2013-10-20T14:24:21.280 回答