#include <stdio.h>
#include <stdlib.h>
int main(void) {
char command[256];
char *token;
const char s[2] = " ";
fprintf(stdout, "$ Please enter a command \n");
fflush( stdout );
fgets ( command, 256, stdin );
token = strtok(command, s);
if (strcmp(token, "loaddungeon") == 0){
fprintf(stdout, "$ loaded successfully \n");
fflush( stdout );
}
}
我正在尝试使用strtok来获取输入的第二个字符串。例如,如果输入为“loaddungeon dfile.txt
”,我想要的是“dfile.txt
”。我的函数能够获得字符串“loaddungeon
”。但我不知道如何获得第二个字符串“dfile.txt
”。谁能告诉我怎么做?
(考虑输入始终为“loaddungeon dfile.txt
”。)
答案 0 :(得分:1)
对strtok
的每次调用都将返回指向给定字符串中找到的最后一个标记的指针(如果没有,则返回null)。要使用空格作为分隔符检索第二个标记,您需要第二次调用strtok
。
int main()
{
char command[256];
char *token1 = NULL;
char *token2 = NULL;
const char s[2] = " ";
fprintf(stdout, "$ Please enter a command \n");
fflush(stdout);
fgets(command, 256, stdin);
token1 = strtok(command, s); // now points to first word
if (NULL != token1) {
token2 = strtok(NULL, s); // now points to second word
}
if (NULL != token2) {
if (strcmp(token2, "loaddungeon") == 0){
fprintf(stdout, "$ loaded successfully \n");
fflush(stdout);
}
}
}
答案 1 :(得分:1)
要阅读第二个字符串,您需要将NULL
传递给strtok()
。请注意,fgets()
会保留输入行中的换行符,因此您应将分隔符定义从char s[2] = " ";
更改为char s[] = " \r\n";
或char s* = " \r\n"
。这样,第二个令牌将不包含任何换行符。另请注意,如果未找到令牌,strtok()
将返回NULL
指针,因此下面的代码会在打印读取令牌之前对此进行测试。
但是,既然你说只有两个字符串,我会考虑只使用sscanf()
。使用%s
转换说明符,sscanf()
会将字符读入字符串,直到遇到空白字符,但不会在字符串中包含此空白字符。在%s
类型函数中使用scanf()
说明符时,应指定最大字段宽度以避免缓冲区溢出。此最大宽度应小于缓冲区的大小,以便为'\0'
字符串终止符留出空间,在这种情况下 255 。 sscanf()
函数返回成功分配的数量,在这种情况下应为 2 。下面显示的sscanf()
方法(已注释掉)会在打印字符串之前检查此返回值。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFER_MAX 256
int main(void) {
char command[BUFFER_MAX];
char *token1 = NULL;
char *token2 = NULL;
const char *s = " \r\n";
fprintf(stdout, "$ Please enter a command \n");
fflush( stdout );
fgets ( command, BUFFER_MAX, stdin );
token1 = strtok(command, s);
token2 = strtok(NULL, s);
if (token1 && token2 && strcmp(token1, "loaddungeon") == 0) {
fprintf(stdout, "$ loaded successfully: %s\n", token2);
fflush( stdout );
}
/* or instead do this */
/*
char word1[BUFFER_MAX], word2[BUFFER_MAX];
if (sscanf(command, "%255s %255s", word1, word2) == 2) {
if (strcmp(word1, "loaddungeon") == 0){
fprintf(stdout, "$ loaded successfully: %s\n", word2);
fflush( stdout );
}
}
*/
return 0;
}