[英]Reading Formatted Input from File with fscanf and sscanf
我必須閱讀具有這種形式的文件
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中(可能是格式),因為函數似乎將整個行“存儲”在鍵上。
有什么幫助嗎?
如果您檢查此scanf
(和族)引用,您將看到"%s"
格式代碼
匹配字符串(非空白字符序列)
因此,格式中的第一個"%s"
與該行中的所有字符匹配,因為字段之間沒有空格。 模式匹配不符合您的預期。
相反,您必須使用"%["
格式:
sscanf(string, "%[^%]%%%[^%]", key, country);
上面的格式字符串匹配除 '%'
字符以外的所有字符,然后模式匹配'%'
以將其丟棄,然后再次匹配除尾部'%'
以外的所有字符。
還要注意,如果scanf
無法匹配所有格式,則不會將指針設置為NULL
,甚至可能根本不向提供的字符串寫入任何內容(使它們未初始化)。 相反,您應該檢查scanf
的返回值。 它應該與格式代碼的數量相匹配,在您的情況下為兩個,否則出現問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.