打印字符数组后程序总是缩进?
Program always indents after printing char array?
我有一个任务要编写一个程序,该程序可以在 bash shell 中使用,模仿某些默认的 Unix 命令,我们应该从头开始构建它们。这些命令之一是 PS1 命令,它应该将 $ 提示更改为命令给出的任何参数。我已经在下面的代码中实现了它,它几乎完美地工作。
在使用 PS1 命令之前,提示符工作正常,它打印 $ 并且不缩进,而是让用户在同一行继续输入。但是,在使用该命令后,只要出现提示,程序就会打印提示,然后换行。我需要它来打印 PS1 char* 而无需换行。
#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; }
}
}
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
是无效内存的句柄。那是未定义的行为。它现在可能不可见,但稍后当您添加更多命令时它会影响您。
如果字符在整个 main
中可见并复制到其中,则将 PS1
设为数组可能会更好。 (数组可以初始化为在开始时保存 "$"
。)
您还应避免在 &input[4]
处使用显式索引。让 strtok
的标记化来处理这个问题。毕竟,可能会有额外的白色 space 并且 " PS1 Command: "
是有效输入。
我有一个任务要编写一个程序,该程序可以在 bash shell 中使用,模仿某些默认的 Unix 命令,我们应该从头开始构建它们。这些命令之一是 PS1 命令,它应该将 $ 提示更改为命令给出的任何参数。我已经在下面的代码中实现了它,它几乎完美地工作。
在使用 PS1 命令之前,提示符工作正常,它打印 $ 并且不缩进,而是让用户在同一行继续输入。但是,在使用该命令后,只要出现提示,程序就会打印提示,然后换行。我需要它来打印 PS1 char* 而无需换行。
#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; }
}
}
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
是无效内存的句柄。那是未定义的行为。它现在可能不可见,但稍后当您添加更多命令时它会影响您。
如果字符在整个 main
中可见并复制到其中,则将 PS1
设为数组可能会更好。 (数组可以初始化为在开始时保存 "$"
。)
您还应避免在 &input[4]
处使用显式索引。让 strtok
的标记化来处理这个问题。毕竟,可能会有额外的白色 space 并且 " PS1 Command: "
是有效输入。