regex C语言从复杂格式的文件中读取字符串

hsgswve4  于 2023-05-19  发布在  其他
关注(0)|答案(1)|浏览(126)

所以我有一个看起来像这样的文件:

9
$11$ pelle
$2$ pollo
$333$ palla
$41$ alla
$5078$ tta
$6$ tti
$7$ ll
$81$ er
$900$ ere

n = 9是我想在程序中读取的键值对的数量。
所以对于key = "11", value = "pelle"等等…

typedef struct {
    char key[20];
    char value[20];
} Dictionary;

int main() {
    FILE *fin = fopen("../dizionario.txt", "r");
    if (fin == NULL) {
        printf("error");
        return 1;
    }

    int n;
    fscanf(fin, "%d", &n);

    Dictionary dict[n];
    for (int i = 0; i < n; i++)
        fscanf(fin, "$%[^$]$ %s\n", dict[i].key, dict[i].value);
    
    fclose(fin);

    for (int i = 0; i < n; i++) {
        printf("Key: %s, Value: %s\n", dict[i].key, dict[i].value);
    }

    return 0;
}

我采用了以下方法来读取每个键值对,并将它们存储在一个dict结构中,我认为这是一个不错的选择。当我打印到控制台以检查值是否到处都是时,输出为:

Key: , Value:
Key: , Value:
Key: , Value:
Key: , Value:
Key: , Value:
Key: , Value:
Key: , Value: å
Key: <0¶[÷, Value:
Key:    , Value: °

我相信问题出在格式字符串上,我似乎无法正确处理:

"$%[^$]$ %s\n"
uujelgoq

uujelgoq1#

1.这里最简单的修复方法是在第二个格式字符串之前添加一个空格``,这样它就忽略了前一行的尾随换行符。
1.使用符号常量作为大小,并且在阅读scanf()字符串时始终使用带值的最大字段。
1.考虑在n上添加一个检查,以确保它足够小(在我的系统上,默认堆栈是8 MB;或者更好地使用malloc()并检查它是否成功)。

#include <stdio.h>

#define KEY_LEN 19
#define VALUE_LEN 19
#define str(s) str2(s)
#define str2(s) #s

typedef struct {
    char key[KEY_LEN + 1];
    char value[VALUE_LEN + 1];
} Dictionary;

int main() {
    FILE *fin = fopen("../dizionario.txt", "r");
    if (!fin) {
        printf("error");
        return 1;
    }
    int n;
    fscanf(fin, "%d", &n);
    Dictionary dict[n];
    for (int i = 0; i < n; i++)
        fscanf(fin, " $%" str(KEY_LEN) "[^$]$ %" str(VALUE_LEN) "s", dict[i].key, dict[i].value);
    fclose(fin);

    for (int i = 0; i < n; i++)
        printf("Key: %s, Value: %s\n", dict[i].key, dict[i].value);
}

和相应的输出:

Key: 11, Value: pelle
Key: 2, Value: pollo
Key: 333, Value: palla
Key: 41, Value: alla
Key: 5078, Value: tta
Key: 6, Value: tti
Key: 7, Value: ll
Key: 81, Value: er

相关问题