我正致力于创建一个简单版本的 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/