【问题标题】:C scanf in a for-loop and where to store the inputfor循环中的C scanf以及存储输入的位置
【发布时间】:2025-11-22 01:00:03
【问题描述】:

在 for 循环中使用 scanf,如果有超过 1 个循环,我应该将输入存储在哪里?尝试使用数组,但总是失败。

假设:

 Please enter number of octets: 3
 Please enter octet: 1
 Please enter octet: 2
 Please enter octet: 3

那么输入应该存储在数组中,但它不起作用。对于控件,我 printf v[2] 应该是 3,但它是另一个数字。

#include<stdio.h>
#include<limits.h>

int main()
{
  int c;
  int v[c];

  printf("Please enter number of octets:\n");
  scanf("%d", &c);

  if ( (c > 1) && (c <  CHAR_MAX))
    {
      for ( i = 1; i <= c; i++)
      {
        printf("Please enter octet:\n");
        scanf("%d", x);
        v[c]=x;
      }
      printf("v[2]: %d\n", v[2]);
    }
  return 0;
}

【问题讨论】:

  • 提供完整代码,我们可以试试运行它!!
  • scanf("%d", &amp;v[i]);
  • 为什么是CHAR_MAX 而不是INT_MAX
  • 启用所有编译器警告 - 这将节省时间。
  • @chux 可以进行完整性检查,但使用 CHAR_MAX 常量来做这件事很奇怪,这有点误导。

标签: c


【解决方案1】:

你可能想要这个:

#include <stdio.h>
#include <limits.h>

int main()
{
  int c;

  printf("Please enter number of octets:\n");
  scanf("%d", &c);

  if ((c > 1) && (c < CHAR_MAX))
  {
    int v[c];

    // scan values into array
    for (int i = 0; i < c; i++)   // indexes from 0 to c-1 !!
    {
      printf("Please enter octet:\n");
      scanf("%d", &v[i]);
    }

    // print all values from array
    for (int i = 0; i < c; i++)
    {
      printf("v[%d]: %d\n", i, v[i]);
    }
  }
  else
  {
     printf("Input error\n");   // show an error message
  }
  return 0;
}

【讨论】:

  • @MichaelWalz.: 为什么CHAR_MAX?
  • Minor:int v[c];if ((c &gt; 1) &amp;&amp; (c &lt; CHAR_MAX)) ... 中可能会更好,否则代码可能永远无法到达printf("Input error\n");
【解决方案2】:

不清楚你想在这里做什么,但如果你修改你的代码,如下所示:-

for ( i = 0; i <= c; i++)
  {
    printf("Please enter octet:\n");
    scanf("%d", &x);
    v[i]=x;
  }
  printf("v[2]: %d\n", v[2]);

要打印所有值,只需添加以下代码

  for ( i = 0; i <= c; i++)
    printf("v[i]: %d\n", v[i]);

【讨论】:

    【解决方案3】:

    从您发布的代码来看,以下几行可能是问题的原因。

    int c;
    int v[c];
    

    这是无效的。在 C 中,数组必须这样声明。

    data_type array_name[size];

    要使您的声明有效,您必须读取 n 的值或像这样指定它。

    int c = 10;
    int v[c];
    

    还有,

    scanf("%d", x);

    改成

    scanf("%d", &x);
    

    【讨论】:

    • 但是如果你得到一个恒定位置的输入..为什么要使用循环?
    • 我不知道他为什么这样做。我指出了他的代码的问题。!!我已编辑回答以向他解释。!
    【解决方案4】:

    我尽量不回答这个问题,但让我指出错误

    #include<stdio.h>
    #include<limits.h>
    
    int main()
    {
      int c;    // uninitialized 
      int v[c]; // this will behave quite unexpectedly because c is uninitialized
    
      printf("Please enter number of octets:\n");
      scanf("%d", &c);
    
      if ( (c > 1) && (c <  CHAR_MAX)) // c is a int so why restrict to CHAR_MAX 
        {
          for ( i = 1; i <= c; i++) // trying to scan c elements and i is undefined
          {
            printf("Please enter octet:\n");
            scanf("%d", x);
            v[c]=x; // assigning to v[c] everytime so if c is 2 v[2] is the only element getting modified. not something you want to
          }
          printf("v[2]: %d\n", v[2]);
        }
      return 0;
    }
    

    【讨论】: