【问题标题】:for loop initial declaration errorfor循环初始声明错误
【发布时间】:2013-10-28 23:55:39
【问题描述】:

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

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

【问题讨论】:

  • 你确定你是用 C++ 编译的吗?
  • 添加编译器选项-std=c99
  • 您未处于 C99 变体模式。
  • 其实它是用 C 写的...不是 C++
  • 可能是this 可以提供帮助!尝试自己用谷歌搜索:)

标签: c


【解决方案1】:

您正在使用仅支持 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

【讨论】:

  • 不要 'fgets()' 用于从文件中读取?我怎么能在这个中使用它??
【解决方案2】:

在循环中声明变量

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-19
      • 2015-08-04
      • 1970-01-01
      • 1970-01-01
      • 2015-06-02
      • 2017-10-28
      • 1970-01-01
      • 2016-06-07
      相关资源
      最近更新 更多