【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.20810

文字列の比較関数
投稿者---ken(2005/04/26 19:41:45)


二つの文字列を比較する際に
strncmp()という関数は、先頭から指定したバイトすうだけ比較するってやつですよね?
先頭からではなく、文字列の後ろからバイト数をしていして比較できる関数ってありますか?

たとえば

char str[] ="abcdefghijkl050429"
char str1[]="mnopqrstuvwx050429"

この二つの文字列のうしろから6文字を比較したいんですけど。



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:文字列の比較関数 20812 REE 2005/04/26 20:01:53
<子記事> Re:文字列の比較関数 20813 まきじ 2005/04/26 20:02:17


No.20812

Re:文字列の比較関数
投稿者---REE(2005/04/26 20:01:53)


>二つの文字列を比較する際に
>strncmp()という関数は、先頭から指定したバイトすうだけ比較するってやつですよね?
>先頭からではなく、文字列の後ろからバイト数をしていして比較できる関数ってありますか?
>
>たとえば
>
>char str[] ="abcdefghijkl050429"
>char str1[]="mnopqrstuvwx050429"
>
>この二つの文字列のうしろから6文字を比較したいんですけど。

strlenとstrcmpを組み合わせれば、比較できます。
strcmp(str + strlen(str) - 6, str1 + strlen(str1) - 6)


この投稿にコメントする

削除パスワード

No.20813

Re:文字列の比較関数
投稿者---まきじ(2005/04/26 20:02:17)


>strncmp()という関数は、先頭から指定したバイトすうだけ比較するってやつですよね?

バイト じゃなく 文字数ですね。


>先頭からではなく、文字列の後ろからバイト数をしていして比較できる関数ってありますか?

文字数 じゃなくて バイト ですか?
なかったと思います。



この投稿にコメントする

削除パスワード

No.20814

Re:文字列の比較関数
投稿者---RiSK(2005/04/26 21:09:59)


>バイト じゃなく 文字数ですね。
>文字数 じゃなくて バイト ですか?

sizeof(char) == 1(byte) という定義ですから,バイト数も文字数も同じでしょう。
strncmp の場合'\0'が出れば文字数(バイト数)指定も無視される可能性もありますが。


この投稿にコメントする

削除パスワード

No.20816

Re:文字列の比較関数
投稿者---まきじ(2005/04/26 21:58:35)


>sizeof(char) == 1(byte) という定義ですから,バイト数も文字数も同じでしょう。

確かに、この場合は同じですね。

char str[256]="あいうえお01234";

とかだと、「文字数」か「バイト数」で変わってくると思って書き込みました。



この投稿にコメントする

削除パスワード

No.20820

Re:文字列の比較関数
投稿者---REE(2005/04/27 11:54:07)


>char str[256]="あいうえお01234";
>
>とかだと、「文字数」か「バイト数」で変わってくると思って書き込みました。

マルチバイト文字と見れば、変わりますが、
strncmpでは、シングルバイト文字と見ますので、変わりありません。



この投稿にコメントする

削除パスワード

No.20829

Re:文字列の比較関数
投稿者---まきじ(2005/04/27 18:21:07)


>マルチバイト文字と見れば、変わりますが、
>strncmpでは、シングルバイト文字と見ますので、変わりありません。

「あ」でも、1 バイトと見るのですか?
1 文字じゃなく?

MSDN で調べてみたところ、文字数となってますが?

int strncmp(const char *string1,const char *string2,size_t count );

string1, string2 比較する文字列。
count 比較する文字数。




この投稿にコメントする

削除パスワード

No.20830

Re:文字列の比較関数
投稿者---REE(2005/04/27 18:39:06)


>>マルチバイト文字と見れば、変わりますが、
>>strncmpでは、シングルバイト文字と見ますので、変わりありません。
>
>「あ」でも、1 バイトと見るのですか?

いいえ 「あ」の場合当然2バイトです(S-JISの場合)。
そしてstrncmpは「あ」を2文字と認識します。
シングルバイト文字の世界では、1バイト=1文字なのです。

>MSDN で調べてみたところ、文字数となってますが?

文字数です。ただ、文字数の数え方が違うだけです。
実際にテストプログラムで確認してみて下さい。
strncmp("あい","あう",2)


この投稿にコメントする

削除パスワード

No.20831

Re:文字列の比較関数
投稿者---Ban(2005/04/27 18:41:33)


>「あ」でも、1 バイトと見るのですか?
>1 文字じゃなく?

str〜をはじめ、C/C++ の標準関数はシングルバイト文字を前提にできてますから、
あくまでバイト単位での設定です。(wchar_t 用の関数はワイド文字を前提)
分りやすい例は strlen("あ") がいくつを返すのか。
# まぁ環境にもよりますが、これで1が返ることは多分ないでしょう。


>string1, string2 比較する文字列。
>count 比較する文字数。

API の説明部分で区別されるバイト/文字と、
標準関数の説明での区別の仕方が異なったりしてます>MSDN



この投稿にコメントする

削除パスワード

No.20832

Re:文字列の比較関数
投稿者---まきじ(2005/04/27 20:04:43)


REEさん、Banさん、レスありがとうございます。

>シングルバイト文字の世界では、1バイト=1文字なのです。
>そしてstrncmpは「あ」を2文字と認識します。

1 バイト = 1 文字ってのは、理解し難いですが、
「あ」を、2 文字として見るとすれば、質問者(ken さん)が
「バイト数」と表現した事も納得いきます。

マルチバイトな文字を使うプログラムを、
あまりコーディングしないせいか
混乱してしまいました。





この投稿にコメントする

削除パスワード

No.20845

Re:文字列の比較関数
投稿者---Ban(2005/04/28 01:07:11)


>1 バイト = 1 文字ってのは、理解し難いですが、
>「あ」を、2 文字として見るとすれば、質問者(ken さん)が
>「バイト数」と表現した事も納得いきます。

もともと、ASCII だけあれば文字が全て表せるような国で
発祥したものですから、1文字といえば普通に1バイトだったのです...。

MBCS なんて、後付のようなもの。lead-byte とか trail-byteとか
苦労するのも、こういう背景が故です。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧