【问题标题】:Scanf with optional text带有可选文本的 Scanf
【发布时间】:2015-11-14 22:22:30
【问题描述】:

我正在尝试读取一个 .txt 文件,该文件在第一行包含姓名和姓氏,下面包含一个数组

问题是第一行可能是也可能不是一个字母 A 放在括号中,如下所示:[A]。

例如:

何塞佩雷斯 [A] 或可能有何塞佩雷斯

当我运行这里提到的代码时,如果第一行不包含 [A],则执行值的移位,例如矩阵 [1] [1] 的值作为测试器向上并在end 完成矩阵。

这是一个示例,说明当第一行中有 [A] 和没有时给出的代码

FILE* text=NULL;
    text=fopen(archivo,"r");
    char name[100];
    char last_name [100];
    char verifier [10];
    int matriz[6][4];
    int i  ;
    int lu,ma,mi,ju,vi;
    if (text == NULL) {
    }
    else {
        fscanf(text,"%s %s %s [^\n]",name, last_name, verifier);
        for( i= 0; i<7;i++){
            fscanf(text,"%d %d %d %d %d [^\n]",&lu, &ma, &mi,&ju,&vi);
            matriz[i][0] = lu;
            matriz[i][1] = ma;
            matriz[i][2] = mi;
            matriz[i][3] = ju;
            matriz[i][4] = vi;
        }
Result:
    Jose Perez 1 
    0 0 0 0 0 
    1 0 1 0 1 
    0 1 1 1 1 
    0 1 1 0 0 
    1 0 0 0 0 
    1 1 1 0 0 
    1 0 1 0 0 
    Juan Perez A 
    1 0 1 1 1 
    0 0 1 1 1 
    0 0 1 0 1 
    0 0 1 1 1 
    1 0 1 0 1 
    0 0 1 1 1 
    0 1 1 1 0 

能解决吗?

【问题讨论】:

  • matriz[6][4] 应该是matriz[7][5]

标签: c file matrix text scanf


【解决方案1】:
    char line[80], fname[16], lname[16], third[4];
    fgets(line, 80, fp)
    if (sscanf(line, "%s %s %s\n", 
              fname, lname, third) == 3 && strcmp(third, "[A]") == 0)
        // the line has a [A] at the end
    else if (sscanf(line, "%s %s\n", fname, lname) == 2)
        // the line does not have a [A] at the end
    else
        fprintf(stderr, "Invalid line");

fgets 从文件中读取下一行。如果不为null,我们检查sscanf的返回值。它返回解析的项目数。因此,成功时它应该返回 3。如果它在行尾包含 [A],则 third 变量应该等于 [A]

做完这些,我们可以继续读取数组了。

【讨论】:

  • 问题是我无论如何都要把它读完,所以下一个 fscanf 继续下一个。您知道任何命令来读取该行,然后再使用 fscanf 重新读取第一个吗?
  • 这就是为什么我首先得到fgets 的行,然后用sscanf 解析字符串。如果我直接使用fscanf,该行将被读取,我将不得不fseek 回到开头。
  • '\n' 格式为"%s %s %s\n"%s %s\n" 没有意义。它给人一种错误的感觉,即最后一个'%s"
【解决方案2】:

由于您的验证者始终是单个字符,因此您可以让scanf 完成这项工作。在下面的示例中,如果左括号不存在,它将停止扫描,否则将获取验证符:

char name[100];
char last_name [100];
char verifier = 0;
int n = fscanf("%s %s [%c]", name, last_name, &verifier);

如果n == 2 没有验证器,如果n == 3 有验证器,在任何其他情况下,都会出现错误。

【讨论】:

  • 最后一个']' 无用验证。如果']' 存在与否,扫描将报告 3。
  • @chux 需要']',因为如果不消费,scanf将无法解析后续数据。
  • 确实"]" 会影响下一个评估。但是验证者测试 current 行更好。
猜你喜欢
  • 1970-01-01
  • 2011-05-03
  • 2016-11-11
  • 2014-01-06
  • 2020-01-22
  • 1970-01-01
  • 2019-04-17
  • 2016-12-28
  • 1970-01-01
相关资源
最近更新 更多