1

空白行で区切られた複数のエントリを持つファイルを解析する必要があります。各エントリの形式は次のとおりです。

ab bababa
2
ab bba
b ba

どこ:

  1. 最初の行:空白で区切られた2つの単語があります。
  2. 2行目:考慮に入れる必要のある行数を示す整数が含まれます
  3. 次の行:空白で区切られた2つの単語がそれぞれ1つずつあります。

各エントリの最後に、関数を呼び出して、エントリにあるいくつかのパラメータを渡す必要があります。具体的には、最初の行にある最初の2つの単語と、整数の後に続く行を表す構造体を含む配列を渡す必要があります。構造体の定義は次のようになります。

typedef struct t_transformation_rule {
    char *needle;
    char *replacement;
} transformation_rule;

私が述べたように、ファイルには複数のエントリを含めることができます。したがって、特定のファイルは次のようになります。

ab bababa
2
ab bba
b ba

a abba
3
a bb
bb abba
a abba

abcd abcd
0

abab bbbaaa
2
ab aaa
ab bbb

これが解析のために行ったことですが、番号を見つけたら構造体の配列を初期化し、その後その配列を使用して次の行を格納しようとするため、問題が発生しますが、その変数は範囲外です。コードは次のとおりです。

void processFile(char *file_name)
{
    char buff[120];
    char needle[20], replacement[20];
    char origin[20], target[20];

    int num, rule_counter;
    size_t len;

    int context,rc;
    transformation_rule *rules_list;

    context =0;
    rule_counter = 0;

    FILE *in = fopen(file_name,"r");

    if (in != NULL) {
      while(fgets (buff, sizeof buff, in)) {
        len = strlen (buff);
        while (len && buff[len-1] == '\n') {
          buff[--len] = 0;
        }
        if (context == 0) {
          rc = sscanf(buff, "%s %s", origin, target);
          context = 1;
        }
        if (context == 1) {
          rc = sscanf(buff, "%d", &num);
          transformation_rule rules_list[num];
          context = 2;
        }
        if (context == 2) {
          if (!len) {
              context = 0;
              continue;
          }
          rc = sscanf(buff, "%s %s", needle, replacement);
          transformation_rule *rule = malloc(sizeof(transformation_rule));

          rule->needle = needle;
          rule->replacement = replacement;

          // HERE I GET THE ERROR SAYING THAT RULES_LIST IS NOT DEFINED
          rules_list[rule_counter] = rule;
          rule_counter++;
        }

      }
    }
}

何が間違っているのか、どうすればもっと簡単にできるのか教えていただければ幸いです。

4

1 に答える 1

2

はい、もっと簡単に行うことができます。でパーツを読んでfscanfから、で解析していましたsscanf。それは問題ありませんが、この場合、これはあなたが探しているものかもしれません:

#include "stdlib.h"
#include "stdio.h"
#include "string.h"
void process(char* start, char* target, int cRules, char** froms, char** tos) {
    // work with it
}
int main(int argc, char** argv) {
    if(argc!=2) { 
        printf("need filename\n");
        return 1;
    }
    FILE* f = fopen(argv[1], "rb");
    if(!f) {
        printf("wrong filename\n");
        return 2;
    }
    char* start = malloc(1000);
    char* target = malloc(1000);
    int cRules;
    while(fscanf(f, "%s %s %i", start, target, &cRules)!=EOF) {
        printf("\ntask %s->%s\nnumber of rules %i\n", start, target, cRules);
        char** froms = malloc(cRules*sizeof(char*));
        char** tos = malloc(cRules*sizeof(char*));
        int iRule = 0; for(; iRule<cRules; ++iRule) {
            froms[iRule] = malloc(100);
            tos[iRule] = malloc(100);
            if(fscanf(f, "%s %s", froms[iRule], tos[iRule])==EOF) {
                printf("format error\n");
                fclose(f);
                return 3;
            };
            printf("rule %i %s->%s\n", iRule, froms[iRule], tos[iRule]);
        }
        process(start, target, cRules, froms, tos);
        for(iRule = 0; iRule<cRules; ++iRule) {
            free(froms[iRule]);
            free(tos[iRule]);
        }
        free(froms);
        free(tos);
    }
    free(start);
    free(target);
    fclose(f);
    return 0;
}
于 2013-02-24T20:40:45.973 に答える