gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:21:44 25 4
gpt4 key购买 nike

我有一个任务要编写一个可以在 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是大括号内的 block 的本地数组,在结束}之后将无效。这意味着 PS1 是无效内存的句柄。这是未定义的行为。它现在可能不可见,但稍后当您添加更多命令时它会咬住您。

如果字符在整个 main 中可见,最好将 PS1 制作为一个数组,然后复制到该数组。 (该数组可以初始化为在开头保存 "$"。)

您还应该避免在 &input[4] 处使用显式索引。让 strtok 的标记化来处理这个问题。毕竟,可能会有额外的空格,并且 "PS1 Command: " 是有效输入。

关于c - 程序在打印字符数组后总是缩进?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54762195/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com