使用scanf传递未知数量的整数

时间:2016-09-25 15:58:20

标签: c arrays

我需要创建一个未知大小的int数组并将它们全部传递。我的代码如下所示:

int FillTable(int a[], int max){
  int i;
  int x = 0;
  int m = 0;
  for (i = 0; i < max; i++){
    printf("Fill the table with integers: ");
    scanf("%d", &m);

    if (m != "" && m != NULL){
      a[i] = m;
    }else if (m != "" && m == NULL){
      a[i] = 0;
    }else{
      break;
    }
  }
  printf("\n");
  return 0;
}

我知道你可以传递多个以空格分隔的整数:

scanf("%d %d %d", &var1, &var2, &var3);

但我不知道如何通过一些我不知道会有多少整数的整数。我可以用一堆%d创建一个字符串,然后只重复 max 次吗?我不知道,但是现在,我只是要求整数,直到数组已满,如果用户没有&#39,我需要能够使数组小于 max ;输入足够的值。有没有人对我如何扫描未知数量的整数有任何想法?

5 个答案:

答案 0 :(得分:2)

  

有没有人对如何扫描未知数量的整数有任何想法?

这需要动态内存分配!

扫描未知整数的一种方法是,首先分配一个大小的整数数组来保存max个整数。

如何知道用户是否已结束输入?

  • 如果您只是在数组条目中扫描用户的正整数,则提示他输入负数来结束输入
  • 或者,如果您确定输入条目的范围,那么当用户输入的输入超出范围时,就会突破循环

示例: (考虑用户仅输入正数)

//creating a large enough array to store user inputs
int *array = malloc(sizeof(int) * max); 

//check if memory was allocated or not    
if(array == NULL)
{
    printf("memory allocation problem!");
    exit(1);
}

//integer to make note of size of array or you can use the sizeof() function instead
int size_of_array = 0;

for (i = 0; i < max; i++)
{
    printf("Fill the table with integers: ");

    if(scanf("%d", &m) != 1) //check for scanf return value
    {   
        printf("wrong input, try again");

        char consume; //to consume the character
        scanf("%c", &consume);

        i--;
        continue;
    }

    if (m > 0) //if positive number, accept
    {
        array[i] = m;
        size_of_array++;
    }

    else       //else break out of scanning
    {
        break;
    }
}

//do the program.....

//don't for get to free the memory at the end
free(array);

这是一个有效的例子:https://ideone.com/BHN4sk

答案 1 :(得分:1)

你正在尝试做一些不必要的事情。要预测数组的大小并重新分配合适的确切大小,计算成本会更高(就cpu时间而言),因此保存已分配的内存的好处是不够的。

中数组的大小存储在某个不一定与数组本身有关的地方。所以你只需要知道程序中有多少数组元素是有趣的,而不是别的。

你可以拥有像

这样的东西
struct Array {
    int *data;
    size_t size;
    size_t count;
};

其中size是数组的总大小,count是数组中元素的数量,data是元素。我经常使用这种模式并且它非常有用,特别是如果与realloc()结合使用,因为它可以节省太多次重复分配内存的费用,而这种代价比使用实际需要的内存要多得多。

但是今天的系统拥有的内存比可以使用的内存多(除非您使用Android Studio,它可以使用与您的计算机一样多的内存)。

答案 2 :(得分:1)

首先,m != "" && m != NULL可能不会按照您的想法执行。你可能来自另一种语言。我认为该语句的作用是将整数变量m中的值与字符串文字""的地址进行比较,然后将其与NULL(计算结果为0)进行比较。

其次,scanf默认读取,直到空格或换行符。

scanf在失败时返回负数,因此您的代码应如下所示:

for (i = 0; i < max; i++){
  printf("Fill the table with integers: ");
  if(scanf("%d", &m) > 0) {    
    a[i] = m;
  }
  else {
    break;
  }
}

我遗漏了a [i] = 0分支,因为我不明白你想要的东西。

此外,您永远不会使用变量x - 除非您遗漏了更多代码。

答案 3 :(得分:0)

你的问题对我来说并不理解,不过我认为这对你有帮助

int arraySize = 200; // Or whatever
int *array_ = malloc(arraySize * sizeof(int));

使用它并传递* array_作为参数,首先定义数组大小或获取数组大小作为用户输入,并运行for循环直到数组大小

答案 4 :(得分:0)

您应该决定用户如何停止输入(并在提示中包含此信息)。一种快速而肮脏的方式是输入任何不是数字的东西&#34;。我选择这种终止输入的方式,因为它易于实现(因此,快速和脏):

then()

注意:

  • 提示尝试用户友好
  • printf("Fill the table with integers; terminate with 'x':\n"); for (i = 0; i < max; i++) { int result = scanf("%d", &a[i]); if (result != 1) break; } 函数将数字直接放入数组中,而不使用任何中间变量
  • scanf函数返回它读取的数字,通常为1;如果它不是1,那么用户输入 x 或其他任何东西
  • 代码完成后,scanf保存迭代次数,显示从用户读取的数量。

您的输入函数应返回数组的大小:

i

您可能还想清除return i; // instead of "return 0" 缓冲区 - 丢弃用户为终止阵列而输入的任何内容:

stdin