2012-10-24 107 views
-1

我試圖讀取一個文件,並從右側分開等號的左手側,並查看左手側是否爲「HOME」。它發現第一個標記是「HOME」,但沒有說明它是否等於「HOME」。基本上寫在文件中的行是「HOME = /cs/nsf」。使用strtok令牌識別()

怎麼回事?

while (fgets(buffer,80,file)) //while end of file 
{ 
    char *token = strtok(buffer,"="); 
    printf("first token: %s\n",token); //this correctly prints "HOME" 
    if (strcmp(token,"HOME") == 0) 
    { 
     printf("it doesn't get here"); 
     token = strtok(NULL,"\n");   //this should return "/cs/nsf" but it doesn't; 
     if (token == NULL || strcmp(token," ") == 0) 
     { 
      fprintf(stderr,"HOME isn't initialised\n") 
     } 
    } 
} 
+0

向我們展示文件的內容。 –

+0

你確定它沒有打印「HOME」嗎? – pstrjds

+0

@ RichardJ.RossIII不必要的。 – 2012-10-24 18:13:19

回答

1

您的第一個printf打印"HOME "。你應該使用"= \t"作爲你的令牌字符串,讓它返回"HOME"(而不是任何空格)。

3

好吧,既然你用=作爲唯一的分隔符爲strtok,你的第一個令牌將包括在輸入字符串中=之前的空間。所以你解析的第一個標記實際上是"HOME "。這就是你的printf正在打印。你看不到最後的空間。

顯然,"HOME ""HOME"不一樣。將空格添加到strtok的分隔符列表中。

0

文件中的HOME後面有空白。

用途:

printf("first token <<%s>>\n", token); 

看問題。然後在比較之前去掉前導和尾隨空白。請注意,明確標記類似於<<>>(可以告訴我不能使用XML文本)的字符串的開始和結尾可以更容易地看到前導空白和尾隨空白以及其他意想不到的效果。我總是發現它是一種有價值的技術。

0
HOME = /cs/nsf 

所以實際上的第一個標記之前不"HOME""HOME " - 注意左邊的空間。

可以使用" = "作爲strtok()的第二個參數或者寫strcmp(token, "HOME ")來實現您想要的。

+0

@EricPostpischil我有沒有提到我討厭Markdown? :P – 2012-10-24 18:20:15

1

您需要從令牌末尾修剪空白。它很可能印刷"HOME "(注意額外的空間)。

2

它必須打印「第一個標記:HOME」(在HOME之後有一個空格)。