2012-10-24 187 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之后有一个空格)。