2014-07-21 30 views
0

引號的字符串我想用C讀取文件的這樣的內容:檢測具有的fscanf

foo="bar" 
alice="bob" 
fruit="pineapple" 

而且我興趣與關鍵愛麗絲相關的具體價值,但周圍無報價。所以,我想要鮑勃

所以,我寫了這樣的事情

編輯:添加關鍵的printf /值

char key[20]; 
char value[20]; 
char output[20]; 

memset(key, 0, 20); 
memset(value, 0, 20); 

while(fscanf(fd, "%19[^=]=\"%19[^\"]\"", key, value) != EOF) { 

    printf("%s=%s", key, value); 

    if (strcmp(key, "alice") == 0) { 
     memset(output, 0, 20); 
     strncpy(output, value, 20); 
     break; 
    } 

    memset(key, 0, 20); 
    memset(value, 0, 20); 
} 

的問題是STRCMP從來沒有任何按鍵之間返回0,所以,表的比較和「愛麗絲」總是假的。我得到這個輸出:

foo=bar 
alice=bob 
fruit=pinneaple 
=pineapple 

還測試了每個鍵的長度,由strlen,它是正確的。除了最後一行,我得到了我期望的結果。所以,我不太明白...

這裏有什麼明顯的錯誤嗎?我試圖調試代碼,但我正在使用非常有限的目標系統(openwrt),並且我無法訪問gdb(實際上,代碼是在另一臺機器上交叉編譯的,因爲我的目標系統甚至沒有編譯器)。

任何幫助表示讚賞。

+0

這可能會幫助你。 [Demo](http://regex101.com/r/wR5cQ3/12) – Braj

+0

你可以打印出變量'key'和'value',看看他們真的是什麼。或者使用調試器並逐行執行並檢查這些變量的內容。 –

+0

謝謝。這與http://www.regexr.com/類似。但我不確定經典正則表達式和scanf語法之間的差異。我確實做錯了什麼。 – jorgeas80

回答

2

請勿使用scanf()作爲用戶輸入(即使它來自文件)。 首選fgets()

你的直接問題是空白。

該文件的內容包括'\n''\n'包含在key中。

如果你想使用fscanf()嘗試添加字符串轉換內部的一些空間,以保持:

while (fscanf(fd, " %19[^=]= \"%19[^\"]\"", key, value) == 2) /* ... */; 
//    ^ ^(2nd one isn't as important) 

還要注意,我改變了條件。 而不是根據EOF進行測試,測試返回值爲2