gpt4 book ai didi

c - 在 C 中解析 bash 命令输入

转载 作者:太空宇宙 更新时间:2023-11-03 23:25:17 25 4
gpt4 key购买 nike

我正在用 C 编写一个简单的 shell。这个 shell 的一部分使用 bash 命令,这些命令需要拆分成一个字符数组,以便我可以正确地执行这些命令。作为一个简单的概念证明,我想制作一个 C 程序来检查它是一个单词还是一个特殊字符( |&>< )。

下面是它的外观示例:

input a command: cat hello.txt |wc -l
---output---
cat
hello.txt
|
wc
-l

到目前为止,我已经完成了所有案例的工作,例如,除了一个案例,那就是当我在 |wc l 中做一个特殊字符时。其中一个字母在特殊字符之后。这是我当前的输出:

input a command: cat hello.txt |wc -l
---output---
cat
hello.txt
|wc
-l

下面是我的代码,我试过添加特殊情况、删除情况,但似乎没有任何效果。我该如何解决?

#include <stdio.h>
#include <string.h>

#define ALPHABET 1000
#define LESS_THAN 60
#define GREATER_THAN 62
#define AMPERSAND 38
#define PIPE 124
#define WHITESPACE 32
#define NEWLINE 10
#define MYCOPOUT 9999

#define CAPITALS(i) ((i >= 65) && (i <= 90))
#define LOWERS(i) ((i >= 97) && (i <= 122))
#define BACKSLASH(i) i == 47

int classify(int i)
{
if (CAPITALS(i) || LOWERS(i) || BACKSLASH(i))
return ALPHABET;
return i;
}

char isSpecial(int i)
{
return (i == LESS_THAN) ||(i == GREATER_THAN) || (i == AMPERSAND) || (i == PIPE);
}

char isWhiteSpace(int i)
{
return (i == WHITESPACE) || (i == NEWLINE);
}

void PRINT_N_NEW(int c, int last)
{
if (isWhiteSpace(last)) {
printf("%c",c);
} else if(isSpecial(last)) {
printf("\n%c\n",c);
} else {
printf("%c\n", c);
}
last = c;
}

int main(int argc, char** argv)
{

int i;
int last = MYCOPOUT;
while ( (i = getchar()) != EOF){
switch(classify(i)){
case ALPHABET:
printf("%c",i);
last = i;
break;
case LESS_THAN:
PRINT_N_NEW(i,last);
break;
case GREATER_THAN:
PRINT_N_NEW(i,last);
break;
case AMPERSAND:
PRINT_N_NEW(i,last);
break;
case PIPE:
PRINT_N_NEW(i,last);
break;
case WHITESPACE:
printf("\n");
last = i;
break;
case NEWLINE:
printf("\n");
last = i;
break;
default:
printf("%c",i);
last = i;
break;
}
}
return 0;
}

最佳答案

您不会在每次循环中都设置last,只是在switch 的某些情况下。在打印普通字符时,您还应该使用 PRINT_N_NEW,这样它会测试最后一个字符并在它之前放置一个换行符。最后,如果你打印的字符是一个特殊字符,你需要在它之前打印一个换行符。

PRINT_N_NEW 的末尾执行 last = c 没有意义。这不会在调用者中设置变量,它只是设置本地副本。

#include <stdio.h>
#include <string.h>

#define ALPHABET 1000
#define LESS_THAN 60
#define GREATER_THAN 62
#define AMPERSAND 38
#define PIPE 124
#define WHITESPACE 32
#define NEWLINE 10
#define MYCOPOUT 9999

#define CAPITALS(i) ((i >= 65) && (i <= 90))
#define LOWERS(i) ((i >= 97) && (i <= 122))
#define BACKSLASH(i) i == 47

int classify(int i)
{
if (CAPITALS(i) || LOWERS(i) || BACKSLASH(i))
return ALPHABET;
return i;
}

char isSpecial(int i)
{
return (i == LESS_THAN) ||(i == GREATER_THAN) || (i == AMPERSAND) || (i == PIPE);
}

char isWhiteSpace(int i)
{
return (i == WHITESPACE) || (i == NEWLINE);
}

void PRINT_N_NEW(int c, int last)
{
if (isWhiteSpace(last)) {
printf("%c",c);
} else if(isSpecial(last) || isSpecial(c)) {
printf("\n%c",c);
} else {
printf("%c", c);
}
}

int main(int argc, char** argv)
{

int i;
int last = MYCOPOUT;
while ( (i = getchar()) != EOF){
switch(classify(i)){
case ALPHABET:
PRINT_N_NEW(i, last);
break;
case LESS_THAN:
PRINT_N_NEW(i,last);
break;
case GREATER_THAN:
PRINT_N_NEW(i,last);
break;
case AMPERSAND:
PRINT_N_NEW(i,last);
break;
case PIPE:
PRINT_N_NEW(i,last);
break;
case WHITESPACE:
printf("\n");
break;
case NEWLINE:
printf("\n");
break;
default:
PRINT_N_NEW(i, last);
break;
}
last = i;
}
return 0;
}

关于c - 在 C 中解析 bash 命令输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28626877/

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