簡體   English   中英

使用fscanf和sscanf從文件讀取格式化的輸入

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM