[解決済み] 警告: 文字列リテラルとの比較は特定されない動作になる
2022-02-01 15:30:08
質問
私はC言語とLinuxに全く精通していないのですが、それがまさに良いアイデアだと思った理由です。
パーサーから始めて、すでにいくつかの問題に遭遇しています。
コードは簡単なはずなので、コメントを入れなかったのはそのためです。
gccで警告が表示されます: "WARNING HERE"でコメントされた行で、 "string literals results in unspecified behaviour" (以下のコードを参照してください).
なぜこれが警告を引き起こすのか見当もつきませんが、本当の問題は "<" と "<" を比較しているにもかかわらず、if の中に入ってこないということです...。
私は説明された問題に対する答えを探していますが、もしコードに何か改善すべき点があれば言ってください。ただ、私はそれほど熟練しておらず、これはまだ進行中の作業であることを心に留めておいてください。
よろしくお願いします。
#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]
は文字列へのポインタ(ヌル文字で終端する配列へのポインタ)であり、同様に
"&"
または
"<"
.
式は
argc[i] == "&"
は、2 つのポインタが同じかどうか (同じメモリ位置を指しているかどうか) をチェックします。
式は
strcmp( argc[i], "&") == 0
は、2つの文字列の内容が同じかどうかをチェックします。
関連
-
[解決済み】「ポインタから異なるサイズの整数へのキャスト」エラーが発生するのはなぜですか?
-
[解決済み】Cコンパイルエラーです。Idは1終了ステータスを返した
-
[解決済み】C言語で浮動小数点例外(コアダンプ)発生
-
[解決済み】 switch case: error: case label does not reduce to an integer constant
-
[解決済み】C言語でint64_t型を表示する方法
-
[解決済み】「複数の定義」「最初に定義されたのはここです」エラーについて
-
[解決済み】malloc():メモリ破壊
-
[解決済み】なぜか。"エラー: 配列型を持つ式への代入"
-
[解決済み】Errno: 11, Resource Temporarily Unavailable(リソースが一時的に利用できない
-
[解決済み] Project Eulerとの速度比較。CとPythonとErlangとHaskellの比較
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C 言語の添え字で配列の要素値を代入すると、配列でもポインタでもベクトルでもない値になる
-
[解決済み】valgrind - サイズ8のブロックが割り当てられた後、アドレス ---- が0バイトになる。
-
[解決済み】Cコンパイルエラーです。Idは1終了ステータスを返した
-
[解決済み] clang: error: linker command failed with exit code 1が表示されるのはなぜですか?
-
[解決済み] struct has no member named
-
[解決済み】MB/sとMiB/sを計算する方法は?
-
[解決済み】argv[]をint型として取得するには?
-
[解決済み】malloc():メモリ破壊
-
[解決済み】エラー:呼び出されたオブジェクトは、関数または関数ポインタではない
-
[解決済み】C言語でpow( )への未定義参照、math.hを含むにもかかわらず【重複】。