c - 为什么 strtok() 在最后一个标记后附加一个空格

标签 c fgets strtok minix string.h

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

有没有办法让我在调用 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可以将换行符'\n'附加到输入的字符串中,前提是相应的字符数组中有足够的空间。

所以用

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

代替

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

来自 C 标准(7.21.7.2 fgets 函数)

2 The fgets function reads at most one less than the number of characters specified by n from the stream pointed to by stream into the array pointed to by s. No additional characters are read after a new-line character (which is retained) or after end-of-file. A null character is written immediately after the last character read into the array.

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

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

//...

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

至于您的代码片段,您似乎得到了以下结果,如演示程序中所示。

#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
"

关于c - 为什么 strtok() 在最后一个标记后附加一个空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58434801/

相关文章:

c - 在 C 中使用 "gets"作为字符串输入

c - 如何复制给定字符串中所有不重复的单词?

c - strtok 不只在指定的分隔符上标记

c - 使用C中的内存映射读取二进制文件

c - 读取 utf8 字符串并将其写入文件

C: printf 没有立即输出

c - 将位图文件读入结构

c - scanf 之后 fgets 不起作用

c++ - 分段违规 : while(fgets(buffer, 15,statfile)!=NULL){};

c - 在 C 中解析 char 数组时遇到问题