EOF и свободная часть неиспользуемого 2d-массива

#c #arrays

#c #массивы

Вопрос:

Я работаю на Java, поэтому я еще не привык к синтаксису c.

Мне нужно сделать следующее: позволить пользователю ввести number k (количество строк), а после вставить значения в 2d-массив с помощью этой формы:

 1  2
3  4
5  6
  

т.е. два значения с пробелом между ними, а затем новая строка для новой строки.
Если пользователь вводил, k=1000 но вводил только 4 строки, поэтому вызов функции был бы только с массивом с 4 строками, а не со 100. цикл, считывающий значения, должен прекратиться, если: имеется k строк, или достигающих 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 rowsn");
    scanf_s("%d", amp;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", amp;num1, amp;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
}
  

Комментарии:

1. Вы можете проверить значение, возвращаемое scanf_s : Количество успешно назначенных аргументов приема (которое может быть равно нулю в случае, если ошибка сопоставления произошла до назначения первого принимающего аргумента), или EOF, если ошибка ввода произошла до назначения первого принимающего аргумента.

2. В частности, убедитесь, что оно равно количеству ожидаемых значений. if(scanf_s("%d %d", amp;num1, amp;num2) != 2) { break; }

3. int num1, num2; for (int i = 0; i < k||num1!=EOF; i ) обратите внимание, что num1 используется до его инициализации. В комментариях выше рассказывается, как решить проблему.

4. К вашему СВЕДЕНИЮ: При чтении файлов EOF считывается автоматически. Если вы используете терминал, вы можете ввести EOF, нажав CTRL D в большинстве терминалов Linux. У меня нет опыта работы в Windows с EOF.

5. Поддержано за переход от Java к C.

Ответ №1:

Измените нижеприведенную часть вашего кода:

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

    printf("Enter two numbers separated by space n");
    scanf_s("%d  %d", amp;num1, amp;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", amp;num1, amp;num2)) break;
    matrix[i][0]=num1;
    matrix[i][1] = num2;
}
k = i;
  

Надеюсь, это будет работать так, как вы хотите

Комментарии:

1. как мне получить значение eof, каким должен быть пользовательский ввод

2. нажмите «Ctrl z», затем нажмите «enter», чтобы вызвать EOF

Ответ №2:

проверьте возвращаемое значение scanf

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

Комментарии:

1. как мне получить значение eof, каким должен быть пользовательский ввод

2. @SandeepPolamuri что здесь произойдет, когда пользователь войдет 1 a ?