1

我正在解析一个文件,并一直在尝试使用该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。

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

4

1 回答 1

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 == ':');
}
于 2015-10-15T08:36:21.270 回答