我必须阅读具有此表格的文件
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(可能是格式化)的某个地方,因为似乎该函数将整行存储在键上。
任何帮助?
答案 0 :(得分:1)
如果你检查,例如this scanf
(and family) reference您会看到"%s"
格式代码
匹配字符串(非空白字符序列)
因此,格式中的第一个"%s"
与行中的所有字符匹配,因为字段之间没有空格。模式匹配不符合预期。
相反,您必须使用"%["
格式:
sscanf(string, "%[^%]%%%[^%]", key, country);
以上格式字符串匹配除 '%'
字符之外的所有字符,然后模式匹配'%'
以丢弃它,然后再次匹配除尾随{{1}之外的所有字符}。
另请注意,如果'%'
无法匹配所有格式,则不会将指针设置为scanf
,甚至可能根本不会向提供的字符串写任何内容(让它们未初始化) 。相反,您应该检查NULL
的返回值。它应该与格式代码的数量匹配,在您的情况下应该匹配,或者存在问题。