以特定格式输入(矩阵)
Input in specific format (matrix)
我的作业输入有问题。在 stdin 上,我将获得特定格式的输入。
在第一行中,将有 2 个整数,用于确定矩阵的大小(行和列)。之后的所有行代表矩阵的行。
我基本上想做类似 getline() 的事情,但我不想使用 getline()。事实上我不能,这是作业中禁止的。因此,我必须逐个扫描 int(或者我猜是逐个 char)。这里的问题是我需要它是防弹的(几乎)。至少防伪。
我正在想象一个大的 while 循环,它一直持续到 EOF 并在另一个循环(也许?)内,它总是读取一行,将其保存到我分配的矩阵并继续进行下一个。我知道我应该检查 '\n',但我今天有点缺乏思考解决方案的能力。
这是我正在使用的:我的矩阵是一个结构。
struct Matrix{
int nrows;
int ncols;
int** matrix;
};
然后我有多个功能。
为特定大小的矩阵动态分配space的函数:
struct Matrix init_matrix(int r, int c)
{
struct Matrix mat;
mat.nrows = r;
mat.ncols = c;
mat.matrix = calloc(r, sizeof(int *));
for(int i = 0; i < r; ++i)
{
*(mat.matrix+i) = calloc(c, sizeof(int));
}
return mat;
}
释放先前分配的函数space:
void free_matrix(struct Matrix mat)
{
int top = mat.nrows;
for(int i = 0; i < top; ++i)
{
free(mat.matrix[i]);
}
free(mat.matrix);
}
这 2 个函数工作得很好。
现在我正在尝试创建一个函数 create_matrix(void)(至少我认为它不应该带任何参数),它将读取我应该接收的输入,例如:
3 3
1 2 3
4 5 6
7 8 9
当函数读取输入时,它可以判断输入是否不正确或格式不正确,并以相应的退出值退出程序(如 100 f.e。)如果输入正确且在正确的格式,它调用 init_matrix() 然后将输入保存到矩阵。
为了您的更深入理解:我应该收到的全部输入是:
矩阵 A(如上,第一行的大小,后面几行的值)
操作 (+,-,*)
矩阵 B
然后执行运算(A*B、A+B等)。我试图把大部分东西变成函数,所以主要的东西会很简单,f.e.
int main(int argc, char *argv[])
{
struct Matrix mat1 = create_matrix();
char operation = get_operation();
struct Matrix mat2 = create_matrix();
struct Matrix result = compute(mat1,mat2, operation);
return 0;
}
如果你明白我的意思,那就是这些行中的内容。问题是我想让程序足够复杂,以便我以后可以编辑它来处理比两个更大的矩阵序列(最多 100 个)。现在我可以用肮脏的方式来做,一次操作就可以让它适用于两个矩阵,但这不是我真正想要的。
好吧,我是这样解决的。有用。它离完美还差得很远,但它确实有效,上传系统接受了它并给了它满分,所以我很满意。
struct Matrix read_matrix(FILE *fp)
{
struct Matrix mat;
//FIRST LINE
int ch;
int i = 0;
int n = 20;
char* line = calloc(n,sizeof(char));
while((ch = fgetc(fp)) != EOF && ch != '\n')
{
*(line + i++) = ch;
}
*(line + n-1) = '[=10=]';
int r,c;
int k = sscanf(line,"%d %d", &r, &c);
if(k != 2)
{
fprintf(stderr, "Error: Chybny vstup!\n");
exit(100);
}
free(line);
//MATRIX
line = calloc(c, sizeof(int));
mat = init_matrix(r, c);
i = 0;
r = 0;
while(r < mat.nrows && (ch = fgetc(fp)))
{
if(ch == '\n' || ch == EOF)
{
*(line + i) = '[=10=]';
int offset;
char *data = line;
for(int j = 0; j < mat.ncols; ++j)
{
int d = sscanf(data, " %d%n", &mat.matrix[r][j], &offset);
if(d != 1){
fprintf(stderr, "Error: Chybny vstup!\n");
exit(100);
}
data += offset;
}
i = 0;
++r;
if(ch == EOF){
break;
}
} else
{
*(line + i++) = ch;
}
}
free(line);
return mat;
}
我的作业输入有问题。在 stdin 上,我将获得特定格式的输入。
在第一行中,将有 2 个整数,用于确定矩阵的大小(行和列)。之后的所有行代表矩阵的行。
我基本上想做类似 getline() 的事情,但我不想使用 getline()。事实上我不能,这是作业中禁止的。因此,我必须逐个扫描 int(或者我猜是逐个 char)。这里的问题是我需要它是防弹的(几乎)。至少防伪。
我正在想象一个大的 while 循环,它一直持续到 EOF 并在另一个循环(也许?)内,它总是读取一行,将其保存到我分配的矩阵并继续进行下一个。我知道我应该检查 '\n',但我今天有点缺乏思考解决方案的能力。
这是我正在使用的:我的矩阵是一个结构。
struct Matrix{
int nrows;
int ncols;
int** matrix;
};
然后我有多个功能。
为特定大小的矩阵动态分配space的函数:
struct Matrix init_matrix(int r, int c)
{
struct Matrix mat;
mat.nrows = r;
mat.ncols = c;
mat.matrix = calloc(r, sizeof(int *));
for(int i = 0; i < r; ++i)
{
*(mat.matrix+i) = calloc(c, sizeof(int));
}
return mat;
}
释放先前分配的函数space:
void free_matrix(struct Matrix mat)
{
int top = mat.nrows;
for(int i = 0; i < top; ++i)
{
free(mat.matrix[i]);
}
free(mat.matrix);
}
这 2 个函数工作得很好。
现在我正在尝试创建一个函数 create_matrix(void)(至少我认为它不应该带任何参数),它将读取我应该接收的输入,例如:
3 3
1 2 3
4 5 6
7 8 9
当函数读取输入时,它可以判断输入是否不正确或格式不正确,并以相应的退出值退出程序(如 100 f.e。)如果输入正确且在正确的格式,它调用 init_matrix() 然后将输入保存到矩阵。
为了您的更深入理解:我应该收到的全部输入是: 矩阵 A(如上,第一行的大小,后面几行的值) 操作 (+,-,*) 矩阵 B
然后执行运算(A*B、A+B等)。我试图把大部分东西变成函数,所以主要的东西会很简单,f.e.
int main(int argc, char *argv[])
{
struct Matrix mat1 = create_matrix();
char operation = get_operation();
struct Matrix mat2 = create_matrix();
struct Matrix result = compute(mat1,mat2, operation);
return 0;
}
如果你明白我的意思,那就是这些行中的内容。问题是我想让程序足够复杂,以便我以后可以编辑它来处理比两个更大的矩阵序列(最多 100 个)。现在我可以用肮脏的方式来做,一次操作就可以让它适用于两个矩阵,但这不是我真正想要的。
好吧,我是这样解决的。有用。它离完美还差得很远,但它确实有效,上传系统接受了它并给了它满分,所以我很满意。
struct Matrix read_matrix(FILE *fp)
{
struct Matrix mat;
//FIRST LINE
int ch;
int i = 0;
int n = 20;
char* line = calloc(n,sizeof(char));
while((ch = fgetc(fp)) != EOF && ch != '\n')
{
*(line + i++) = ch;
}
*(line + n-1) = '[=10=]';
int r,c;
int k = sscanf(line,"%d %d", &r, &c);
if(k != 2)
{
fprintf(stderr, "Error: Chybny vstup!\n");
exit(100);
}
free(line);
//MATRIX
line = calloc(c, sizeof(int));
mat = init_matrix(r, c);
i = 0;
r = 0;
while(r < mat.nrows && (ch = fgetc(fp)))
{
if(ch == '\n' || ch == EOF)
{
*(line + i) = '[=10=]';
int offset;
char *data = line;
for(int j = 0; j < mat.ncols; ++j)
{
int d = sscanf(data, " %d%n", &mat.matrix[r][j], &offset);
if(d != 1){
fprintf(stderr, "Error: Chybny vstup!\n");
exit(100);
}
data += offset;
}
i = 0;
++r;
if(ch == EOF){
break;
}
} else
{
*(line + i++) = ch;
}
}
free(line);
return mat;
}