【发布时间】:2020-04-02 01:27:41
【问题描述】:
我有一个函数可以检查文本文件中表示的矩阵的有效性。 文件应如下所示:
3 5
1 2 3 4 5
5 4 3 2 1
7 6 4 3 2
第一行必须包含矩阵的维度。当然,每一行必须包含相同数量的元素,并且所有元素都必须是数字。此外,给定的维度必须对应于给定的矩阵。我已经实现了一个非常丑陋的解决方案,但我想改进它。
int rowc, colc;
char row[MAXSIZE], digit;
char* pch;
int rlength, prev_rlenght;
FILE* fp = fopen(file_name, "r");
if(fp == NULL){
msg_print(file_nf);
return inv_map;
}
for(int i = 0; fgets(row, MAXSIZE, fp); i++){
if(i == 0){
pch = strtok(row, " ");
for(int i = 0; pch != NULL; i++){
pch = strtok(NULL, " ");
if(i > 2){
return inv_map;
}
}
}
else if(i == 1){
rlength = strcspn(row, "\n");
continue;
}
else if(i > 1){
prev_rlenght = rlength;
rlength = strcspn(row, "\n");
if(prev_rlenght != rlength){
return inv_map;
}
}
else
continue;
}
rewind(fp);
//check dimensions
fscanf(fp, "%d", &rowc);
fscanf(fp, "%d", &colc);
int i = 0;
while((digit = fgetc(fp)) != EOF)
if(isdigit(digit))
i++;
if(i != rowc * colc)
return inv_map;
rewind(fp);
如果您知道如何优雅地重写它,请告诉我。感谢您的关注。
【问题讨论】:
-
所有元素都必须是数字,你的意思是所有元素都必须是整数还是所有元素都必须是单个数字的整数?
-
我会
fgets阅读完整的行。然后我会调用一个只解析一个数字的辅助函数。如果成功读取数字、到达字符串末尾或检测到无效字符,则该函数应返回结果。那么代码应该看起来更好。 -
元素必须是个位数的整数