我正在努力创建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
"