如何为可变数量的单词标记化输入

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,因此它不会在令牌末尾包含换行符。