打印字符数组后程序总是缩进?

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: " 是有效输入。