我正在开始一个用C编写linux简化shell的项目.我对C和linux都不精通,这正是我认为这是个好主意的原因.

从解析器开始,我已经遇到了一些问题.

代码应该很简单,这就是为什么我没有包含任何注释.

我在gcc中得到了一个警告:"与字符串文本进行比较会导致未指定的行为",在带有"warning HERE"(请参阅下面的代码)注释的行中.

我不知道这为什么会引起警告,但真正的问题是,尽管我在比较一个"&lt到一个"&lt如果你不进go 的话...

我正在寻找解释问题的答案,但是如果你在代码中看到一些需要改进的地方,请说出来.请记住,我不是那么熟练,这仍然是一项正在进行的工作(或者更好的是,一项正在开始的工作).

提前谢谢.

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

typedef enum {false, true} bool;

typedef struct {
    char **arg;
    char *infile;
    char *outfile;
    int background;
} Command_Info;

int parse_cmd(char *cmd_line, Command_Info *cmd_info)
{
    char *arg;
    char *args[100];    

    int i = 0;
    arg = strtok(cmd_line, " \n");
    while (arg != NULL) {
        args[i] = arg;
        arg = strtok(NULL, " \n");
        i++;
    }

    int num_elems = i;

    cmd_info->infile = NULL;
    cmd_info->outfile = NULL;
    cmd_info->background = 0;

    int iarg = 0;
    for (i = 0; i < num_elems; i++)
    {
        if (args[i] == "&") //WARNING HERE
            return -1;      
        else if (args[i] == "<") //WARNING HERE
            if (args[i+1] != NULL)
                cmd_info->infile = args[i+1];
            else
                return -1;

        else if (args[i] == ">") //WARNING HERE
            if (args[i+1] != NULL)
                cmd_info->outfile = args[i+1];
            else
                return -1;          

        else 
            cmd_info->arg[iarg++] = args[i];
    }

    cmd_info->arg[iarg] = NULL;

    return 0;   
}

void print_cmd(Command_Info *cmd_info)
{
    int i;  
    for (i = 0; cmd_info->arg[i] != NULL; i++)
        printf("arg[%d]=\"%s\"\n", i, cmd_info->arg[i]);
    printf("arg[%d]=\"%s\"\n", i, cmd_info->arg[i]);    
    printf("infile=\"%s\"\n", cmd_info->infile);
    printf("outfile=\"%s\"\n", cmd_info->outfile);
    printf("background=\"%d\"\n", cmd_info->background);
}

int main(int argc, char* argv[])
{
    char cmd_line[100];
    Command_Info cmd_info;

    printf(">>> ");

    fgets(cmd_line, 100, stdin);

    parse_cmd(cmd_line, &cmd_info);

    print_cmd(&cmd_info);

    return 0;
}

推荐答案

您希望使用strcmp() == 0来比较字符串,而不是简单的==,后者只比较指针是否相同(本例中不同).

args[i]是指向字符串的指针(指向以null结尾的字符数组的指针),"&""<"也是.

表达式argc[i] == "&"判断两个指针是否相同(指向相同的内存位置).

表达式strcmp( argc[i], "&") == 0将判断两个字符串的内容是否相同.

C++相关问答推荐

理解C中的指针定义

如何启用ss(另一个调查套接字的实用程序)来查看Linux主机上加入的多播组IP地址?

编译SDL 2时缺少SDL_ttf

C中的__attributor__((aligned(4),packed))与 struct 的用法

使用NameSurname扫描到两个单独的字符串

使用额外的公共参数自定义printf

为什么在函数内部分配内存空间时需要添加符号?

变量>;-1如何在C中准确求值?

为什么将函数名括在括号中会禁用隐式声明?

什么是.c.h文件?

For循环中的变量行为不符合预期.[C17]

无法访问共享目标文件内的共享指针

如何在双向表中实现线程安全,每个条目仅使用4位,同时避免任何全局锁?

合并对 struct 数组进行排序

C:Assignment中的链表赋值从指针目标类型中丢弃‘const’限定符

我不知道为什么它不能正常工作,我用了get()和fget(),结果是一样的

当用C打印过多的';\n';时输出不正确

计算SIZE_MAX元素的长数组的大小

程序对大输入给出错误答案

在C中定义函数指针?