我正在解析文件,并且一直在尝试使用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。
这可能有点令人困惑,所以如果需要澄清,请告诉我。
答案 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 == ':');
}