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

时间:2017-05-05 21:38:39

标签: c segmentation-fault tokenize

在这里,我试图将用户输入标记为例如load sml.txt。 load命令工作正常,因为它有2个令牌,但如果我尝试使用像display这样的单个词输入,它会崩溃并给我一个段错误。我假设它是因为第二个令牌是NULL,但我不知道如何规避这个问题。你能帮忙吗?

供您参考COMMAND_LOAD =" load"和COMMAND_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] = '\0';
        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;
}

1 个答案:

答案 0 :(得分:2)

当没有更多令牌时,

strtok()会返回NULL,您可以检查此内容。如果没有令牌,我会通过将'\0'分配给第一个字符来清空目标字符串,而不是调用strcpy()

do
{
    printf("Enter your command: \n");
    fgets(input, sizeof(input), stdin);
    token = strtok(input, " \n");
    if (token) {
        strcpy(load, token);
    } else {
        load[0] = '\0';
    }
    token = strtok(NULL, " \n");
    if (token) {
        strcpy(fileN, token);
    } else {
        fileN[0] = '\0';
    }
    ...
} while (strcmp(load, COMMAND_QUIT) != 0);

也无需用\0替换字符串中的最后一个字符。只需在\n分隔符中加入strtok(),这样就不会在代码中包含换行符。