为什么这不删除用户命令末尾的“&”?
Why doesn't this delete the '&' from the end of the user command?
我正在用 C 编写一个基本的 shell,我希望它是这样的情况,如果输入的命令包含 &,那么它将在后台和用户中 运行仍然可以执行其他命令。
但出于某种原因,我可以让程序在后台进入 运行,所以我知道 IF 语句有效(它检查“&”的地方)但我无法获取它从命令中删除“&”符号。
这里是相关代码,有问题欢迎提问:
int main(void)
{
Command cmd;
int n;
while (!done) {
char *line;
line = readline("> ");
//This should check if 'line' contains an &, and remove it if so.
if (strchr(line, "&") != NULL) {
line[strlen(line) - 1] = '[=10=]';
char **cmds;
cmds = separateCmd(line);
if (!line) {
/* Encountered EOF at top level */
done = 1;
} else {
stripwhite(line);
if(*line) {
add_history(line);
/* execute it */
n = parse(line, &cmd);
PrintCommand(n, &cmd);
executeBgCmd(cmds);
}
}
if(line) {
free(line);
}
} else {
char **cmds;
cmds = separateCmd(line);
if (!line) {
/* Encountered EOF at top level */
done = 1;
} else {
stripwhite(line);
if(*line) {
add_history(line);
/* execute it */
n = parse(line, &cmd);
PrintCommand(n, &cmd);
executeCmd(cmds);
}
}
if(line) {
free(line);
}
}
}
return 0;
}
如有任何帮助,我们将不胜感激。提前谢谢你:D
当我编译你的代码并查看我看到的警告时:
warning: passing argument 2 of ‘strchr’ makes integer from pointer without a cast [-Wint-conversion]
所以编译器告诉我你的代码是错误的!查找 strchr
(例如 http://man7.org/linux/man-pages/man3/strchr.3.html),我看到 strchr
期望第二个参数是要搜索的字符。但是您的代码传递了一个字符串(或更准确地说:指向字符串第一个字符的指针):
if (strchr(line, "&") != NULL) {
^^^
ups
试试这个
if (strchr(line, '&') != NULL) {
从手册页我还可以看到 strchr
returns 一个指向字符的指针(如果找到的话)。因此,编写如下代码可能是有意义的:
char* pHit = strchr(line, '&');
if (pHit != NULL) {
*pHit = '[=13=]'; // Terminate string at first &
}
因此 &
不必是最后一个字符。
一个简单的测试程序可以是:
int main()
{
char line[] = "hello & world";
printf("Before: %s\n", line);
char* pHit = strchr(line, '&');
if (pHit != NULL) {
*pHit = '[=14=]';
}
printf("After: %s\n", line);
return 0;
}
输出:
Before: hello & world
After: hello
我正在用 C 编写一个基本的 shell,我希望它是这样的情况,如果输入的命令包含 &,那么它将在后台和用户中 运行仍然可以执行其他命令。
但出于某种原因,我可以让程序在后台进入 运行,所以我知道 IF 语句有效(它检查“&”的地方)但我无法获取它从命令中删除“&”符号。
这里是相关代码,有问题欢迎提问:
int main(void)
{
Command cmd;
int n;
while (!done) {
char *line;
line = readline("> ");
//This should check if 'line' contains an &, and remove it if so.
if (strchr(line, "&") != NULL) {
line[strlen(line) - 1] = '[=10=]';
char **cmds;
cmds = separateCmd(line);
if (!line) {
/* Encountered EOF at top level */
done = 1;
} else {
stripwhite(line);
if(*line) {
add_history(line);
/* execute it */
n = parse(line, &cmd);
PrintCommand(n, &cmd);
executeBgCmd(cmds);
}
}
if(line) {
free(line);
}
} else {
char **cmds;
cmds = separateCmd(line);
if (!line) {
/* Encountered EOF at top level */
done = 1;
} else {
stripwhite(line);
if(*line) {
add_history(line);
/* execute it */
n = parse(line, &cmd);
PrintCommand(n, &cmd);
executeCmd(cmds);
}
}
if(line) {
free(line);
}
}
}
return 0;
}
如有任何帮助,我们将不胜感激。提前谢谢你:D
当我编译你的代码并查看我看到的警告时:
warning: passing argument 2 of ‘strchr’ makes integer from pointer without a cast [-Wint-conversion]
所以编译器告诉我你的代码是错误的!查找 strchr
(例如 http://man7.org/linux/man-pages/man3/strchr.3.html),我看到 strchr
期望第二个参数是要搜索的字符。但是您的代码传递了一个字符串(或更准确地说:指向字符串第一个字符的指针):
if (strchr(line, "&") != NULL) {
^^^
ups
试试这个
if (strchr(line, '&') != NULL) {
从手册页我还可以看到 strchr
returns 一个指向字符的指针(如果找到的话)。因此,编写如下代码可能是有意义的:
char* pHit = strchr(line, '&');
if (pHit != NULL) {
*pHit = '[=13=]'; // Terminate string at first &
}
因此 &
不必是最后一个字符。
一个简单的测试程序可以是:
int main()
{
char line[] = "hello & world";
printf("Before: %s\n", line);
char* pHit = strchr(line, '&');
if (pHit != NULL) {
*pHit = '[=14=]';
}
printf("After: %s\n", line);
return 0;
}
输出:
Before: hello & world
After: hello