使用fscanf和sscanf从文件读取格式化输入

时间:2014-06-28 13:21:12

标签: c

我必须阅读具有此表格的文件

Aalborg%Denmark%
Aba%Nigeria%
Abadan%Iran%
Abaetetuba%Brazil%
Abakan%Russia%

我正在使用这批代码(printf已添加用于测试):

    char *key, *country, *string, *endofl;
    key = malloc (25*(sizeof(char)));
    country = malloc (35 * sizeof(char));
    string = malloc (60* sizeof(char));
    if (fgets(string, 60, from) != NULL) {      
        endofl = strchr(string, '\n');
        printf("%s\n", endofl);
        if (endofl != NULL)
            *(endofl) = '\0';
        sscanf(string, "%s%%%s%%", key, country);
    if (key != NULL && country != NULL) {
        printf("------%s|%s------\n", string, key); //Elem->key
        strcpy(Elem->key, key); 
        printf("------%s|%s------\n", Elem->country, country);
        strcpy(Elem->country, country);
    printf("Helooo\n");
}

我理解我的问题出现在sscanf(可能是格式化)的某个地方,因为似乎该函数将整行存储在键上。

任何帮助?

1 个答案:

答案 0 :(得分:1)

如果你检查,例如this scanf (and family) reference您会看到"%s"格式代码

  

匹配字符串(非空白字符序列)

因此,格式中的第一个"%s"与行中的所有字符匹配,因为字段之间没有空格。模式匹配不符合预期。

相反,您必须使用"%["格式:

sscanf(string, "%[^%]%%%[^%]", key, country);

以上格式字符串匹配除 '%'字符之外的所有字符,然后模式匹配'%'以丢弃它,然后再次匹配除尾随{{1}之外的所有字符}。


另请注意,如果'%'无法匹配所有格式,则不会将指针设置为scanf,甚至可能根本不会向提供的字符串写任何内容(让它们未初始化) 。相反,您应该检查NULL的返回值。它应该与格式代码的数量匹配,在您的情况下应该匹配,或者存在问题。