如何为可变数量的单词标记化输入
How to tokenize input for variable amount of words
在这里,我试图标记用户输入,例如load sml.txt
。
加载命令工作正常,因为它有 2 个标记,但如果我尝试使用像 display
这样的单个单词输入,它会崩溃并给我一个段错误。我假设它是因为第二个标记是 NULL,但我不知道如何规避这个问题。你能帮忙吗?
供您参考 COMMAND_LOAD = "load" 和 COMMAND_DISPLAY = "display"。
int main(int argc, char **argv)
{
AddressBookList *addressBookList;
char input[BUFSIZ];
char load[BUFSIZ];
char fileN[BUFSIZ];
char *fileName;
char *token;
showStudentInformation();
do
{
printf("Enter your command: \n");
fgets(input, sizeof(input), stdin);
input[strlen(input) - 1] = '[=10=]';
token = strtok(input, " ");
strcpy(load, token);
token = strtok(NULL, " ");
strcpy(fileN, token);
fileName = fileN;
if (strcmp(load, COMMAND_LOAD) == 0)
{
addressBookList = commandLoad(fileName);
}
else if (strcmp(load, COMMAND_UNLOAD) == 0)
{
/*commandUnload(fileName);*/
}
else if (strcmp(load, COMMAND_DISPLAY) == 0)
{
if (fileN == NULL)
{
printf("> No file loaded");
}
else
{
commandDisplay(addressBookList);
}
}
else
{
printf("> Invalid input\n\n");
}
} while (strcmp(load, COMMAND_QUIT) != 0);
return EXIT_SUCCESS;
}
strtok()
returns NULL
当没有更多的令牌时,你可以检查这个。如果没有标记,我会通过将 '[=13=]'
分配给第一个字符来清空目标字符串,而不是调用 strcpy()
.
do
{
printf("Enter your command: \n");
fgets(input, sizeof(input), stdin);
token = strtok(input, " \n");
if (token) {
strcpy(load, token);
} else {
load[0] = '[=10=]';
}
token = strtok(NULL, " \n");
if (token) {
strcpy(fileN, token);
} else {
fileN[0] = '[=10=]';
}
...
} while (strcmp(load, COMMAND_QUIT) != 0);
也不需要用 [=15=]
替换字符串中的最后一个字符。只需在 strtok()
分隔符中包含 \n
,因此它不会在令牌末尾包含换行符。
在这里,我试图标记用户输入,例如load sml.txt
。
加载命令工作正常,因为它有 2 个标记,但如果我尝试使用像 display
这样的单个单词输入,它会崩溃并给我一个段错误。我假设它是因为第二个标记是 NULL,但我不知道如何规避这个问题。你能帮忙吗?
供您参考 COMMAND_LOAD = "load" 和 COMMAND_DISPLAY = "display"。
int main(int argc, char **argv)
{
AddressBookList *addressBookList;
char input[BUFSIZ];
char load[BUFSIZ];
char fileN[BUFSIZ];
char *fileName;
char *token;
showStudentInformation();
do
{
printf("Enter your command: \n");
fgets(input, sizeof(input), stdin);
input[strlen(input) - 1] = '[=10=]';
token = strtok(input, " ");
strcpy(load, token);
token = strtok(NULL, " ");
strcpy(fileN, token);
fileName = fileN;
if (strcmp(load, COMMAND_LOAD) == 0)
{
addressBookList = commandLoad(fileName);
}
else if (strcmp(load, COMMAND_UNLOAD) == 0)
{
/*commandUnload(fileName);*/
}
else if (strcmp(load, COMMAND_DISPLAY) == 0)
{
if (fileN == NULL)
{
printf("> No file loaded");
}
else
{
commandDisplay(addressBookList);
}
}
else
{
printf("> Invalid input\n\n");
}
} while (strcmp(load, COMMAND_QUIT) != 0);
return EXIT_SUCCESS;
}
strtok()
returns NULL
当没有更多的令牌时,你可以检查这个。如果没有标记,我会通过将 '[=13=]'
分配给第一个字符来清空目标字符串,而不是调用 strcpy()
.
do
{
printf("Enter your command: \n");
fgets(input, sizeof(input), stdin);
token = strtok(input, " \n");
if (token) {
strcpy(load, token);
} else {
load[0] = '[=10=]';
}
token = strtok(NULL, " \n");
if (token) {
strcpy(fileN, token);
} else {
fileN[0] = '[=10=]';
}
...
} while (strcmp(load, COMMAND_QUIT) != 0);
也不需要用 [=15=]
替换字符串中的最后一个字符。只需在 strtok()
分隔符中包含 \n
,因此它不会在令牌末尾包含换行符。