【问题标题】:Check validity of matrix saved in txt file检查保存在txt文件中的矩阵的有效性
【发布时间】: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 阅读完整的行。然后我会调用一个只解析一个数字的辅助函数。如果成功读取数字、到达字符串末尾或检测​​到无效字符,则该函数应返回结果。那么代码应该看起来更好。
  • 元素必须是个位数的整数

标签: c algorithm matrix


【解决方案1】:

这是一个更简单的解决方案,strtol()

  • 函数读取第一行并解析行数和列数
  • 然后它进入一个循环,一次读取一行,假设它们少于MAXSIZE-1 个字符
  • 对于每一行,它会解析尽可能多的数字
  • 如果少于cols 数字或少于rows 行,则文件被拒绝。
#include <stdio.h>
#include <stdlib.h>

// return 0 if matrix is OK, non zero for error
int check_matrix(FILE *fp) {
    char buf[MAXSIZE];
    int row, col, rows, cols;
    char *p1, *p2;

    if (!fgets(buf, sizeof buf, fp))
        return 1;
    if (sscanf(buf, "%d%d", &rows, &cols) != 2)
        return 2;
    if (rows < 0 || cols < 0)
        return 3;
    for (row = 0; row < rows; row++) {
        if (!fgets(buf, sizeof buf, fp))
            return 4;
        for (p1 = buf, col = 0;; col++) {
            while (*p1 == ' ')
                p1++;
            if (*p1 == '\n')
                break;
            errno = 0;
            strtol(p1, &p2, 10);
            if (errno != 0 || p2 == p1)
                return 5;
            p1 = p2;
        }
        if (col != cols)
            return 6;
    }
    rewind(fp);
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-10
    相关资源
    最近更新 更多