Estoy empezando un proyecto de escribir un shell simplificado para Linux en C. No soy competente en C ni en Linux, esa es precisamente la razón por la que decidí que sería una buena idea.Advertencia: la comparación con literales de cadena da como resultado un comportamiento no especificado
Comenzando con el analizador, ya he encontrado algunos problemas.
El código debe ser sencillo, es por eso que no incluí ningún comentario.
Aparece una advertencia con gcc: "la comparación con literales de cadena da como resultado un comportamiento no especificado" en las líneas comentadas con "ADVERTENCIA AQUÍ" (ver el código a continuación).
no tengo ni idea de por qué esto provoca una advertencia, pero el verdadero problema es que a pesar de que estoy comparando un "<" a un "<" es no recibe dentro del si ...
I Estoy buscando una respuesta para el problema explicado, sin embargo, si hay algo que ve en el código que debería mejorarse, dígalo. Solo tenga en cuenta que no soy tan competente y que esto todavía es un trabajo en progreso (o mejor aún, un trabajo en el comienzo).
Gracias de antemano.
#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;
}
Si realmente sólo desea comprobar un solo carácter, que puede hacer 'si (args [i] && args [i] [0] == '< ') '. – GManNickG