No.4ベストアンサー
- 回答日時:
>できればstr系ではなく、mem系を使用する
>ようにと言われているのですが・・・。
ずいぶんと、イジワルなことを言われちゃいましたね。
では、がんばってみましょう。
{
char *ptr1, *ptr2;
int maxleng;
maxleng = (d1->len - strlen(d2) < 0)?strlen(d2):d1->len ;
ptr1 = malloc((size_t)maxleng+1);
ptr2 = malloc((size_t)maxleng+1);
memset(ptr1, 0x00, maxleng+1);
memset(ptr2, 0x00, maxleng+1);
memcpy(ptr1, d1->ptr, d1->len);
memcpy(ptr2, d2, strlen(d2));
if( memcmp( ptr1, ptr2, maxleng ) == 0 ) {
// 一致した場合の処理
}
else {
// 一致しなかった場合の処理
}
free(ptr1);free(ptr2);
}
-----------------------------------------------
どうでしょう?判りにくくなったでしょ?(笑)
memcmpで比較する2つの領域のサイズが、memcmpの第3パラメータ
で指定する数値よりも小さいと、落っこちる可能性が
あるんで、maxlengを求めるようにしました。
私なら、間違い無くstrcmp()を使います。楽だし。見やすいし。
それか、whileしながら1文字ずつ比較する内部関数を作ります。
>比較対照がunsigned char と charのためキャストしなけ
>ればコンパイルエラーとかなりませんか?
エラーにはなりませんが、気になるなら、
strcmp((char *)ptr, d2) または、
memcmp((void *)ptr1, (void *)ptr2, (size_t)maxlen)
にしてみましょう。でも、ここまでするのはヤリスギな気がします。
何にキャストするのが正解かは、string.hとかmemory.hの中を
見たり、HELP(とかman)を見れば判ります。
No.5
- 回答日時:
strlen(d2)とd1->lenが違えば(=長さが違えば)既に一致しないわけですから比較する必要はありません。
よって、比較はmemcmp(d2, d1->ptr, d1->len)でオッケーです。
if (strlen(d2) == d1->len) {
if (!memcmp(d2, d1->ptr, d1->len)) {
/* 一致 */
return ;
}
}
/* 不一致 */
キャストについては
C:viod*は全てのポインタを受け入れるので必要なし
C++:void*とunsigned char *,char *の変換についてワーニングがでるので(void*)へのキャストをしてもよい。
標準C/C++の時ですのでコンパイルオプションによってはCでもワーニングになったりエラーになったりします。
No.3
- 回答日時:
先ほどの私の回答にバグがありました。
ごめんなさい。たとえば、
d1->ptr が "abc" で、 d2が "abcd"の場合、
d1->lenは、d1->ptrの長さなので、 3 になりますよね。
そうすると、
strncmp( "abc", "abcd", 3 ) になります。
これでは、先頭の3文字しか比較していないため、「一致している」
となってしまいます。(gccで確認しました)
やっぱり、d1->ptrをヌルターミネートしている別変数にいれた方が
よさそうですね。(頭悪くてごめんなさい)
----------------------------------------
{
char *ptr;
ptr = malloc((size_t)d1->len + 1);
memset(ptr, 0x00, d1->len+1);
memcpy(ptr, d1->ptr, d1->len);
if( strcmp( ptr, d2 ) == 0 ) {
// 一致した場合の処理
}
else {
// 一致しなかった場合の処理
}
free(ptr);
}
------------------------------------------
きっと、もっとスマートなやり方あるんでしょうね。
でも、比較自体はカンペキになったでしょ?
この回答への補足
ありがとうございます。
ただちょっと補足なのですが、
できればstr系ではなく、mem系を使用する
ようにと言われているのですが・・・。
また、比較対照がunsigned char と char
のためキャストしなければコンパイルエラー
とかなりませんか?
No.2
- 回答日時:
わざわざ、d1->lenで、長さをもっているんで
d1->ptrはヌルターミネートしていない可能性
がありますね。
----------------------------------------------
if( strncmp( d1->ptr, d2, d1->len ) == 0 ) {
// 一致した場合の処理
}
else {
// 一致しなかった場合の処理
}
----------------------------------------------
こっちの方が安全かも知れません。
ただし、strncmp()はクセがある関数なので、
HELPなどを良くみてください。
もし、d1->ptrがヌルターミネートされているのなら、
cockyさんの方法の方が安全確実で、お勧めです。
参考URL:http://flex.ee.uec.ac.jp/www/japanese/edu/95IC2/ …
No.1
- 回答日時:
単純に
if( strcmp( d1->ptr, d2 ) == 0 ) {
// 一致した場合の処理
}
else {
// 一致しなかった場合の処理
}
でいいんじゃないですか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 数学 数1 この問題の(3)で少なくとも一方が実数解をもつ。のとき①②の式をそれぞれD1,D2とした時D1 5 2023/08/01 01:46
- Visual Basic(VBA) エクセル VBA 条件付き書式 簡略化したい 2 2022/06/02 17:46
- Visual Basic(VBA) 【VBA】先月分の取得ができない理由が分かりません。 2 2022/04/24 11:16
- 数学 【 数I 二次方程式の実数解 】 問題 ※写真の(2) 解答 いずれか一方のみが実数解を持つため に 1 2022/06/25 17:36
- 物理学 平行板コンデンサに誘電率ε1を持つ誘電体1と誘電率ε2を持つ 誘電体2を隙間なく詰める。極板の面積を 1 2023/08/10 22:46
- Visual Basic(VBA) ExcelVBAでDo Until loopのネスト、IF文を使って一致する物と一致しない物としたい 11 2022/12/24 17:46
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- Visual Basic(VBA) VBA処理追加 こちらでご教示頂いたのですが回答完了させてしまいましたのでこちらからまた質問させてく 2 2022/10/27 09:57
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のfor文です。 繰り返しの...
-
strchr() の第2引数はなぜ int ...
-
CStringをwchar_tに変換したい
-
_TCHAR*での引数の読み込み
-
間接操作のレベルとは
-
fgetsなどのときのstdinのバッ...
-
c++ 文字列を入力して、一文字...
-
C言語の入力した文字を反転させ...
-
ftoa の作り方
-
標準ライブラリ関数の自作につ...
-
c言語です。
-
ネットワークにつながっている...
-
str系関数を使わずに二つの文字...
-
構造体のアライメント調整
-
間接参照のレベルが異なっています
-
文字列から空白を取り除きたい...
-
起動時の引数の取得方法が分か...
-
コマンドラインに入力されてい...
-
配列をnビットシフトする
-
RGB→YUV変換のプログラム
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
charでの計算?
-
C言語のfor文です。 繰り返しの...
-
charからLPTSTRへの変換方法
-
文字列から空白を取り除きたい...
-
C言語の入力した文字を反転させ...
-
'const char *' 型は 'char *' ...
-
配列をnビットシフトする
-
str系関数を使わずに二つの文字...
-
int main()の・・・
-
atoi( ) の反対をやりたい
-
CStringをwchar_tに変換したい
-
c++ 文字列を入力して、一文字...
-
switch文で文字を比較すること...
-
干支のプログラム
-
3桁区切(コンマ)記号をつけ...
-
絶対パスからのファイル名の切...
-
間接操作のレベルとは
-
間接参照のレベルが異なっています
-
型変換
おすすめ情報