在这里,我试图将用户输入标记为例如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;
}
答案 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()
,这样就不会在代码中包含换行符。