C 不理解strtok()的结果

C 不理解strtok()的结果,c,parsing,strtok,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: .

我正在解析一个文件,并且一直在尝试使用
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:
数组:
,和
消息:

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

char *token;
token = strtok(line, ":");
if (token != NULL)
{
        //Do things with the token I grabbed
}
因此,当我只调用一次strtok,并将其另存为token时,我假设如果行中存在分隔符,我只为token存储一个值。否则,令牌将为NULL。所以我想如果我检查一下令牌是否为空,如果它通过了,我肯定会有一行,其中令牌有一个“:”这样我就会抓住我最初想要的行

当这个代码在我的程序中执行时,我会抓取每行的第一个“单词”,并将其保存为令牌。此外,对于没有任何内容的行(空行),它会在气井中保存一些内容,因为它不被视为空

这可能有点混乱,所以如果需要澄清,请让我知道

如果你
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 == ':');
}
#包括
int ENDSWITHCLONIGNOREWS(字符*str){
char lastnonws=*str++;
如果(lastnonws!='\0'){
而(*str!='\0'){
如果(!isspace(*str))
lastnonws=*str;
str++;
}
}
返回(lastnonws==':');
}
如果你
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 == ':');
}
#包括
int ENDSWITHCLONIGNOREWS(字符*str){
char lastnonws=*str++;
如果(lastnonws!='\0'){
而(*str!='\0'){
如果(!isspace(*str))
lastnonws=*str;
str++;
}
}
返回(lastnonws==':');
}

我不明白为什么在这种情况下使用strok,如果您只想检查子字符串,请使用strstrstr。如果我不确定要查找什么,我怎么可以使用strstr,我只知道其中会有“:”字样?您不知道要查找什么?你不是说你想知道什么时候有一行包含冒号吗?然后只需执行token=strstrstr(第,“:”)或从末尾循环查找冒号。Strtok用于拆分字符串。Ah strstrstr工作。因此,如果我在令牌中保存了“loop:”,如何从字符串中删除:?请记住
strtok()
在字符串中查找令牌边界,并在令牌的末尾写入null(因此它会修改输入字符串)。当分隔符不出现时,整个字符串就是标记,因此您将得到一个指向字符串开头的指针,而不是NULL。我不明白为什么在这种情况下使用strok,如果您只想检查子字符串,请使用strstr如果我不确定要找什么,我只知道它将有一个“:”在里面?你不知道你在找什么?你不是说你想知道什么时候有一行包含冒号吗?然后只需执行token=strstrstr(第,“:”)或从末尾循环查找冒号。Strtok用于拆分字符串。Ah strstrstr工作。因此,如果我在令牌中保存了“loop:”,如何从字符串中删除:?请记住
strtok()
在字符串中查找令牌边界,并在令牌的末尾写入null(因此它会修改输入字符串)。当分隔符不出现时,整个字符串就是标记,因此您将得到一个指向字符串开头的指针,而不是NULL。