不了解strtok()的结果

时间:2013-04-28 22:28:22

标签: c parsing strtok

我正在解析文件,并且一直在尝试使用strtok()函数尝试帮助完成该过程。想象一下文本文件中的这段摘录:

.text
main:
        lw $a0, array
        lw $a2, size
loop:
        add $t2, $a0, $t2
        sw $t0, 0($t2)
        bne $t3, $zero, loop

        li $v2, 8
        syscall

.data
array:    .word 0:10
message: .asciiz "Hello"

我目前正在逐行抓取类似于此文件的文件。我想知道我的末尾有一个包含冒号的行,例如main:loop:array:message:

为此,我尝试使用这段代码,

char *token;
token = strtok(line, ":");
if (token != NULL)
{
        //Do things with the token I grabbed
}

因此,当我只调用strtok一次,并将其保存为令牌时,我假设我只存储了令牌的值,如果该行中存在分隔符。否则令牌将为NULL。所以我想如果我检查一下令牌是否为null,如果它通过了我肯定会有一个令牌有一个“:”的行,因此我会抓住我原本想要的行。

当我的程序中执行此代码时,我抓住每一行的第一个“单词”并将其保存为令牌。对于没有任何东西的行(空白行),它可以节省一些气体,因为它不被认为是NULL。

这可能有点令人困惑,所以如果需要澄清,请告诉我。

1 个答案:

答案 0 :(得分:1)

如果您strtok(":")一行不包含:,则不会获得NULL,您基本上只会获得该行。所以你使用的方法不起作用。

如果您只想查看字符串是否以:结尾,您可以使用:

int len = strlen (str);
if ((len > 1) && (str[len-1] == ':'))
    itEndsWithAColon();

请注意,在执行此操作之前,如果您已获得\n行,则可能需要删除尾随空格(包括fgets)。一种方法是将整个事物移动到一个函数中,例如:

#include <ctype.h>
int endsWithColonIgnoreWs (char *str) {
    char lastnonws = *str++;
    if (lastnonws != '\0') {
        while (*str != '\0') {
            if (! isspace (*str))
                lastnonws = *str;
            str++;
        }
    }
    return (lastnonws == ':');
}