我一直在尝试创建自己的shell程序,我一直在寻找的教程建议使用 strtok()函数。虽然,我无法简单地解析我的命令行,但我不确定我做错了什么。在 parseCmd()函数中首次使用 strtok()时,我一直收到细分错误。
到目前为止,这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#define MAXSIZE 512
int parseCmd(char *cmd, char *args[])
{
printf("LOGGER: parseCmd(cmd=%s, args=%p)\n", cmd, args);
char cmdDelims[] = " >";
char *cmdReader;
cmdReader = strtok(cmd, cmdDelims);
printf("LOGGER: cmdReader=%s\n", cmdReader);
int i = 0;
while (cmd != NULL)
{
printf("LOGGER: %d counter", i);
args[i] = strdup(cmdReader);
cmdReader = strtok(NULL, " >");
i++;
}
}
int main()
{
char *in;
in = malloc(MAXSIZE);
char *args[10];
char *cmd = NULL;
int errorBit = 0;
int terminationBit = 1;
char inDelims[] = "\n";
while (terminationBit)
{
printf("mysh>");
fgets(in, MAXSIZE, stdin);
cmd = strtok(in, inDelims);
errorBit = parseCmd(cmd, args);
if (errorBit)
{
fprintf(stderr, "Error: Cannot parse command %s\n", cmd);
exit(1);
}
if (*args == "exit")
{
terminationBit = 0;
}
}
return 0;
}
非常感谢您对此主题的任何帮助或建议。
编辑: 根据输出, segfault实际可能不是strtok()。
以下是一些输出:
mysh>hi sup
LOGGER: parseCmd(cmd=hi sup, args=0x7fff50ec0b80)
LOGGER: cmdReader=hi
Segmentation fault: 11
答案 0 :(得分:1)
似乎是一个简单的错误:
while (cmd != NULL)
{
// ...
}
......应该是:
while (cmdReader != NULL)
{
// ...
}
...因为cmd
很可能永远不会成为NULL
。另外,这个:
if (*args == "exit")
{
terminationBit = 0;
}
......可能不会按照你的想法去做。要比较字符串,请使用:
if (strcmp(*args, "exit") == 0)
{
terminationBit = 0;
}
您必须确保parseCmd
也返回一些内容,否则请执行以下操作:
errorBit = parseCmd(cmd, args);
... parseCmd
会产生未定义的行为,因此errorBit
的值也是完全未定义的,后续检查其值的条件也是如此。
最后,您的程序实际上会泄漏内存,因为您strdup
和malloc
并且永远不会自由。完成free
后,请不要忘记args
。