gpt4 book ai didi

c - 不理解 strtok() 的结果

转载 作者:太空宇宙 更新时间:2023-11-04 03:56:11 30 4
gpt4 key购买 nike

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

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

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

因此,当我只调用一次 strtok 并将其保存为标记时,我假设如果行中存在定界符,我只是为标记存储一个值。否则 token 将为 NULL。所以我想,如果我检查 token 是否不为 null,如果它通过了,我肯定会有一行 token 有一个“:”,因此我会捕获我最初想要的行。

当这段代码在我的程序中执行时,我抓取每一行的第一个“单词”并将其保存为标记。同样对于没有任何内容的行(空行),它可以很好地节省气体,因为它不被视为 NULL。

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

最佳答案

如果你 strtok(":") 一行不包含 :,你不会得到 NULL,你基本上得到刚刚的线。所以你使用的方法是行不通的。

如果你只是想看看一个字符串是否以:结尾,你可以使用:

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

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

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

关于c - 不理解 strtok() 的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16268695/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com