C语言 为什么 strtok() 在最后一个标记后附加一个空格



我正在努力创建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:%snf:%sn", cmd, f);
printf("cmd:%snf:%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 fgets 函数读取的最多比 由流中的 n 指定的字符 流 to 指向 由 S 指向的数组。在 换行符(保留(或文件末尾之后。空值 字符在读入的最后一个字符之后立即写入 数组。

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

#include <string.h>
#include <stdio.h>
//...
fgets(cmd, BUFFLIM, stdin);
cmd[ strcspn( cmd, "n" ) ] = '';

至于您的代码片段,那么您似乎有以下结果,如演示程序所示。

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

相关内容

  • 没有找到相关文章

最新更新