我開始在C語言中編寫一個簡化的shell for linux的項目。我完全沒有熟練使用C語言和Linux,這正是我認爲這將是一個好的原因理念。警告:與字符串文字的比較會導致未指定的行爲
從解析器開始,我已經遇到了一些問題。
代碼應該很直接,這就是爲什麼我沒有包含任何評論。
我收到警告與海灣合作委員會:「比較與字符串文字導致未指定的行爲」在行註釋「警告這裏」(見下面的代碼)。
我不知道爲什麼這會導致一個警告,但真正的問題是,即使我是一個比較「<」到「<」是沒有的,如果...
我裏面得到我正在尋找解釋問題的答案,但是如果您在應該改進的代碼中看到某些內容,請說出來。請記住我並不那麼精通,而且這仍然是一項正在進行的工作(或者更好的是,這是一項開始的工作)。
在此先感謝。
#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;
}
如果你真的只想檢查單個字符,你可以做'如果(參數[I] && ARGS [I] [0] ==「< 「)'。 – GManNickG 2010-04-08 20:11:43