【问题标题】:Why does strtok() append a space to the last token为什么 strtok() 会在最后一个标记后附加一个空格
【发布时间】:2020-02-14 12:04:53
【问题描述】:

我正在创建一个简单版本的 Minix。我正在使用fgets() 来获取用户输入。然后我使用strtok() 将字符串与分隔符" " 分开。问题是当我调用strtok(NULL, " ") 时,我存储的令牌会在最后一个字符后面附加一个空格。因此,如果我通过"minimount imagefile.img",我的程序将抓取minimount 并将其存储在变量cmd 中,然后它将抓取"imagefile.img " 并将其放入变量flag。注意flag变量末尾的空格是在token方法之后添加的。

在调用令牌后,有没有办法让我只抓取末尾没有空格的字符串。或者有没有办法操纵字符串以删除附加的空间?

printf("Minix: ");

fgets(cmd, BUFFLIM, stdin);

//parses string using delimiter " "

char *token = strtok(cmd, " ");

//assigns flag to what is after delimiter 

char *f = strtok(NULL, " ");

//printf("cmd:%s\nf:%s\n", cmd, f);

printf("cmd:%s\nf:%s", cmd, f);

输出:

cmd:"minimount"
f:"imagefile.img "

【问题讨论】:

  • 它可能不是真正的空格,而是fgets() 添加到缓冲区的换行符。您必须手动删除此换行符。
  • 这看起来可能是一个错误。 strtok() is supposed to terminate that second token。请提供一个完整的示例
  • 您在 flag 变量周围引用的输出带有 " 与代码不匹配 - 代码具有 f 而不是 flag 并且不打印任何双引号。这让我们想知道什么是什么 - 您需要确保您的代码与您的问题匹配。

标签: c fgets strtok minix string.h


【解决方案1】:

标准函数fgets可以在输入的字符串后追加换行符'\n',前提是对应的字符数组有足够的空间。

所以用

char *f = strtok(NULL, " \n");

而不是

char *f = strtok(NULL, " ");

来自 C 标准(7.21.7.2 fgets 函数)

2 fgets 函数读取的次数最多小于 1 从流指向的流中由 n 指定的字符 into s 指向的数组。 a 后不读取其他字符 换行符(保留) 或在文件结尾之后。一个空 在读入最后一个字符后立即写入字符 数组。

另一种方法是最初从输入的字符串中删除字符,例如

#include <string.h>
#include <stdio.h>

//...

fgets(cmd, BUFFLIM, stdin);
cmd[ strcspn( cmd, "\n" ) ] = '\0';

至于您的代码 sn-p 那么您似乎有以下结果,如演示程序中所示。

#include <stdio.h>
#include <string.h>

int main(void) 
{
    char s[100];

    fgets( s, sizeof( s ), stdin );

    char *cmd = strtok( s, " " );

    char *f = strtok( NULL, " " );

    printf( "cmd:\"%s\"\nf:\"%s\"", cmd, f );

    return 0;
}

程序输出是

cmd:"minimount"
f:"imagefile.img
"

【讨论】:

  • 感谢您解决问题。问题是 fgets() 附加换行符,因此使用 cmd[ strcspn( cmd, "\n" ) ] = '\0';工作!
最近更新 更多