EOF和未使用的二维数组的自由部分

时间:2019-03-29 20:23:10

标签: c arrays

我的背景是Java,所以我还不习惯c语法。

我需要执行以下操作:让用户输入数字k(行数),然后以这种形式将值插入2d数组:

1  2
3  4
5  6

,即两个值之间有空格,然后为新行添加新行。 如果用户输入了k=1000但仅输入了4行,则函数调用将仅针对具有4行而不是100行的数组。如果以下条件,则读取值的循环应停止:有k行< strong>或达到EOF

我的问题:

  1. 我不知道如何实现EOF部分。
  2. 我不知道如何在k = 1000的情况下实现该功能,并且只有4行,因此调用仅包含4行的数组的函数

这是我的代码:

#include <stdio.h>
#define COLS 2
void foo(int** rows, int n);
int main()
{

    int k;
    printf("Please enter number of rows\n");
    scanf_s("%d", &k);

    int** matrix = (int**)malloc(k * sizeof(int*));
    for (int i = 0; i < k; i++)
        matrix[i] = (int*)malloc(COLS * sizeof(int));

    int num1, num2;
    for (int i = 0; i < k||num1!=EOF; i++)
    {

        printf("Enter two numbers separated by space \n");
        scanf_s("%d  %d", &num1, &num2);
        matrix[i][0]=num1;
        matrix[i][1] = num2;
    }

    printf("The array:: \n");
    for (int i = 0; i < k; i++)
    {
        for (int j = 0; j < COLS; j++)
        {
            printf("%d \t",matrix[i][j]);
        }
        printf("\n");
    }
    foo(matrix, k);
    for (int i = 0; i < k; i++)
    {
        free(matrix[i]);
    }
    free(matrix);
    return 0;
}

void foo(int** rows, int n)
{
    //some stuff
}

2 个答案:

答案 0 :(得分:0)

检查scanf的返回值

for (int i = 0; i < k; i++)
{
    printf("Enter two numbers separated by space \n");
    if(scanf_s("%d  %d", &num1, &num2)==EOF)
        break;
    matrix[i][0]=num1;
    matrix[i][1] = num2;
}

答案 1 :(得分:0)

更改代码的下面部分:

for (int i = 0; i < k||num1!=EOF; i++)
{

    printf("Enter two numbers separated by space \n");
    scanf_s("%d  %d", &num1, &num2);
    matrix[i][0]=num1;
    matrix[i][1] = num2;
}

收件人:

int i;
for (i = 0; i < k; i++)
{

    printf("Enter two numbers separated by space \n");
    if(2 !=  scanf_s("%d  %d", &num1, &num2)) break;
    matrix[i][0]=num1;
    matrix[i][1] = num2;
}
k = i;

希望它会按您的意愿工作