簡體   English   中英

使用fscanf檢測帶引號的字符串

[英]Detect quoted strings with fscanf

我想用C讀取這樣的文件內容:

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

我對與密鑰alice關聯的特定值感興趣,但是沒有周圍的引號。 所以,我想要鮑勃

所以,我寫了這樣的東西

編輯:添加了鍵/值的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。因此,任何鍵和“ alice”之間的比較總是錯誤的。 我得到以下輸出:

foo=bar
alice=bob
fruit=pinneaple
=pineapple

還測試了每個鍵的長度,以strlen表示,這是正確的。 除了最后一行,我得到了我所期望的。 所以,我不太了解...

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

任何幫助表示贊賞。

不要將scanf()用於用戶輸入(即使它來自文件)。 更喜歡fgets()

您的直接問題是空白。

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

如果要繼續使用fscanf()嘗試在轉換字符串中添加一些空格:

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

另請注意,我更改了條件。 而不是根據EOF測試,而是測試返回值為2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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