単純なCプログラムで作業していると、ifテストで行き詰まります。
int line_number = 0;
if ((line_number >= argv[2]) && (line_number <= argv[4]))
gccは言う:
cp.c:25:警告:ポインターと整数の比較 cp.c:25:警告:ポインターと整数の比較
処理したい行の範囲を適切にチェックするにはどうすればよいですか?
単純なCプログラムで作業していると、ifテストで行き詰まります。
int line_number = 0;
if ((line_number >= argv[2]) && (line_number <= argv[4]))
gccは言う:
cp.c:25:警告:ポインターと整数の比較 cp.c:25:警告:ポインターと整数の比較
処理したい行の範囲を適切にチェックするにはどうすればよいですか?
もちろん、それは機能しません: ..argv
へのポインタへのポインタchar
です。何をしたいのかは明確ではありませんが、それargv[2]
は3番目のパラメータであり、argv[4]
5番目のパラメータであると考えてください。ただし、これらはchar*
型(文字列)であるため、整数として解析する場合は、次の関数を使用して解析する必要がありますatoi
。
int value = atoi(argv[2]);
3番目のパラメーターとして使用されたintを解析し、それを変数に配置します。その後、必要なものをチェックできます。
関数を使用しないでくださいatoi
。事実なら、それが今まで存在したことを忘れるべきです。実用的な用途はありません。
ジャックの答えは、argv
文字列を最初に数値に変換する必要があるという点で正しいですがatoi
、その目的で使用することは(特に、入力が「外界」から来る状況で)、Cプログラミングに対する犯罪です。atoi
プログラムで意味のある使用ができる状況は事実上ありません。
この場合に使用する必要がある関数は次のとおりです。strtol
char *end;
long long_value = strtol(argv[2], &end, 10);
if (*end != '\0' || errno == ERANGE)
/* Conversion error happened */;
正確なエラーチェック条件(必要かどうかなど*end == '\0'
)は、実際には意図によって異なります。
最後にを取得したい場合は、範囲(またはアプリケーション固有の範囲)int
の値も確認する必要がありますint
if (long_value < INT_MIN || long_value > INT_MAX)
/* Out of bounds error */;
int value = long_value;
/* This is your final value */