我分配了一个程序,可以在bash shell中使用该程序来模仿某些默认的Unix命令,我们应该从头开始构建它们。这些命令之一是PS1命令,该命令应该将$提示符更改为命令给出的任何参数。我已经在下面的代码中实现了它,并且效果几乎完美。
在使用PS1命令之前,提示会正常工作,它会打印$且不会缩进,而是让用户继续在同一行上键入内容。但是,使用该命令后,每当提示出现提示时,程序将打印提示,然后转到新行。我需要它来打印PS1字符*而无需换行。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
int main(int argc, char *argv[]) {
int exit = 0;
char* PS1 = "$";
while(exit == 0){
char* token;
char* string;
char input[500];
printf("%s", PS1);
fgets (input, 500, stdin);
token = strtok(input, " ");
if(strncmp(token, "exit", 4) == 0){
exit = 1;
break;
}
else if(strncmp(token, "echo", 4) == 0){
token = strtok (NULL, " ");
while (token != NULL){
printf ("%s", token);
printf("%s", " ");
token = strtok (NULL, " ");
}
}
else if(strcmp(token, "PS1") == 0){
token = strtok (NULL, " ");
char temp[300];
strcpy(temp, &input[4]);
PS1 = temp; }
}
}
答案 0 :(得分:0)
fgets
在末尾保留换行符,以便打印出来。阅读该行后,您可以摆脱它:
fgets (input, sizeof(input), stdin);
strtok(input, "\n");
您的代码还有其他问题:
... else if (strcmp(token, "PS1") == 0) {
token = strtok (NULL, " ");
char temp[300];
strcpy(temp, &input[4]);
PS1 = temp;
}
字符数组temp
在大括号中是块的局部字符,在结束}
之后将无效。这意味着PS1
是无效内存的句柄。那是不确定的行为。它可能暂时不可见,但是以后您添加更多命令时会咬住您。
如果在整个PS1
中可见的字符,最好将main
做成一个数组,然后复制到该数组。 (可以将数组初始化为在开头保留"$"
。)
您还应该避免在&input[4]
处使用显式索引。让标记strtok
处理。毕竟,可能还有其他空白,并且" PS1 Command: "
是有效的输入。