#c #arrays
#c #массивы
Вопрос:
Я работаю на Java, поэтому я еще не привык к синтаксису c.
Мне нужно сделать следующее: позволить пользователю ввести number k
(количество строк), а после вставить значения в 2d-массив с помощью этой формы:
1 2
3 4
5 6
т.е. два значения с пробелом между ними, а затем новая строка для новой строки.
Если пользователь вводил, k=1000
но вводил только 4
строки, поэтому вызов функции был бы только с массивом с 4 строками, а не со 100. цикл, считывающий значения, должен прекратиться, если: имеется k строк, или достигающих EOF
Мои вопросы:
- Я не знаю, как реализовать часть EOF.
- Я не знаю, как реализовать это для 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
?