在这里,我正在尝试以用户输入为代价。load sml.txt
。加载命令正常工作,因为它具有2个令牌,但是如果我尝试使用诸如display
之类的单词输入,它会崩溃并给我一个segfault。我之所以认为是因为第二个令牌是无效的,但是我不知道如何绕过这个问题。你能帮忙吗?
对于您的参考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] = ' ';
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 inputnn");
}
} while (strcmp(load, COMMAND_QUIT) != 0);
return EXIT_SUCCESS;
}
strtok()
返回NULL
如果没有更多令牌,您可以检查此功能。如果没有令牌,我通过将' '
分配给第一个字符来清空目标字符串,而不是调用strcpy()
。
do
{
printf("Enter your command: n");
fgets(input, sizeof(input), stdin);
token = strtok(input, " n");
if (token) {
strcpy(load, token);
} else {
load[0] = ' ';
}
token = strtok(NULL, " n");
if (token) {
strcpy(fileN, token);
} else {
fileN[0] = ' ';
}
...
} while (strcmp(load, COMMAND_QUIT) != 0);
也无需用