文字列の比較:Cプログラミング

String Comparison C Programming



C言語の文字列は文字の配列であり、ヌル文字( 0)で終了します。このプロパティ文字列を使用して比較されます。







2つの文字列はさまざまな方法で比較できます。このチュートリアルでは、最初に2つの文字列を比較するためのユーザー定義関数を示し、次に2つの文字列を非常に簡単に比較するために使用できるいくつかの組み込みライブラリ関数を示します。それでは、始めましょう。



ユーザー定義関数を使用した文字列比較:

関数を書きます stringCompare() 文字列を比較します。文字列をトラバースし、いずれか1つまたは両方の終わりに到達するまで、または1つの不一致が見つかるまで、文字列の各文字を比較します。トラバーサルが両方の文字列の終わりに到達した場合、文字列は一致します。そうしないと、文字列が一致しません。



01/*userDefinedFunction.c*/
02
03#含む
0404
05intstringCompare(( charstr1[ ] charstr2[ ] )。
06{{
07int=0;
08。
09。 その間((str1[] ==str2[] )。
10
15
16もしも((str1[] == ' 0' &&str2[] == ' 0' )。
17戻る 0;
18そうしないと
19戻る -1;
20
21}
22
2. 3
24int主要(()。
25{{
26charstr1[30]str2[30];
27
28printf (('最初の文字列を入力してください:')。;
29scanf (('%[^NS]% * NS 'str1)。;
30printf (('2番目の文字列を入力してください:')。;
31scanf (('%[^NS]% * NS 'str2)。;
32
33もしも((stringCompare((str1str2)。 == 0)。
3. 4printf (('文字列は等しいNS')。;
35そうしないと
36printf (('文字列が等しくないNS')。;
37
38戻る 0; 39}





ここでは、whileループと変数を使用して文字列をトラバースします 。両方の文字列の同じ位置で文字が等しい場合、 1ずつ増加します(13行目)。文字が等しくない場合(09行目)、または文字列の最後に到達した場合(11行目)、whileループは中断されます。 whileループの後、両方の文字列走査が最後まで到達したかどうかを確認します(16行目)。トラバーサルが両方の文字列の終わりに到達した場合、文字列は等しくなり、そうでない場合は等しくなりません。

組み込みライブラリ関数を使用した文字列比較:

次のライブラリ関数は、文字列の比較に使用できます。すべての関数はで宣言されています string.h ヘッダーファイル。



strcmp()関数:

この関数は、関数に渡された2つの文字列を比較します。

構文

int strcmp ((const char *str1 const char *str2)。

戻り値: 文字列が等しい場合は0を返します。最初の文字列の最初の一致しない文字のASCII値が2番目の文字列よりも小さい場合は、負の整数を返します。最初の文字列の最初の一致しない文字のASCII値が2番目の文字列より大きい場合は、正の整数を返します。一部のシステムは、最初の不一致文字のASCII値の差を返し、一部のシステムは、最初の文字列の最初の不一致文字のASCII値が2番目の文字列よりも小さい場合は-1を返し、最初の不一致文字のASCII値が最初の文字列が2番目の文字列よりも大きい。

戻り値 説明
strcmp( Hello World、Hello World )。 0 2つの文字列は同じです。
strcmp( こんにちは、こんにちは 0世界 )。 0 文字列は文字「 0」まで比較されます。デフォルトでは、最初の文字列は「 0」で終わり、2番目の文字列には「Hello」の後に「 0」文字が含まれます。
strcmp( Hello 0 0 0″、Hello 0 World )。 0 文字列は文字「 0」まで比較されます。
strcmp( Hello World、Hello World )。 負の整数 最初の文字列(「H」)の最初の一致しない文字のASCII値が、2番目の文字列(「h」)よりも小さい
strcmp( hello World、Hello World )。 正の整数 最初の文字列(「h」)の最初の一致しない文字のASCII値が、2番目の文字列(「H」)よりも大きい

strncmp()関数:

この機能は機能に似ています strcmp() 、ただし、ここでは、関数に追加の引数を渡すことによって、比較されるバイト数を指定する必要があります。

構文:

int strncmp ((const char *str1 const char *str2 size_tNS)。

戻り値: 関数は戻ります 0 最初の場合 NS 2つの文字列の文字は同じです。それ以外の場合は、最初の不一致文字のASCII値の差の符号に応じて、負または正の整数を返します。

戻り値 説明
strncmp( Hello World、Hello World、5 )。 0 最初の5文字は同じです。
strncmp( こんにちは、こんにちは 0世界、5 )。 0 最初の5文字は同じです。
strncmp( Hello 0 0 0″、Hello 0 World、8 )。 0 「 0」は、両方の文字列の最初の5文字の後にあります。したがって、比較は8ではなく5の後で停止します。
strncmp( Hello World、Hello World、5 )。 負の整数 最初の文字列(「H」)の最初の一致しない文字のASCII値が、2番目の文字列(「h」)よりも小さい

strcasecmp()関数:

この機能は機能に似ています strcmp() 、ただし、ここでは文字列では大文字と小文字は区別されません。

構文:

intstrcasecmp((const char *str1 const char *str2)。

戻り値: と同じ strcmp() 、ただし文字列は次のように扱われます 大文字小文字を区別しません

戻り値 説明
strcasecmp( Hello World、Hello World )。 0 2つの文字列は同じです。
strcasecmp( こんにちは、こんにちは 0世界 )。 0 文字列は文字「 0」まで比較されます。デフォルトでは、最初の文字列は「 0」で終わり、2番目の文字列には「Hello」の後に「 0」文字が含まれます。
strcasecmp( Hello World、Hello World )。 0 文字列は 大文字小文字を区別しません。 つまり、HelloWorldとHelloWorldは同じです。

strncasecmp()関数:

この機能は機能に似ています strncmp() 、ただし、ここでは文字列では大文字と小文字は区別されません。

構文:

intstrncasecmp((const char *str1 const char *str2)。

戻り値: と同じ strncmp() 、文字列が大文字と小文字を区別しないものとして扱われる場合。

戻り値 説明
strncasecmp( Hello World、Hello World、5 )。 0 最初の5文字は同じです。
strncasecmp( こんにちは、こんにちは 0世界、5 )。 0 最初の5文字は同じです。
strncasecmp( Hello 0 0 0″、Hello 0 World、8 )。 0 「 0」は、両方の文字列の最初の5文字の後にあります。したがって、比較は8ではなく5の後で停止します。
strncasecmp( Hello World、Hello World、5 )。 0 文字列は 大文字小文字を区別しません。 だから、こんにちはとこんにちはは同じです。

memcmp()関数:

この関数は、2つのメモリブロックをバイトごとに比較します。比較するメモリブロックとバイト数の2つのポインタを渡す必要があります。

構文:

int memcmp ((const 空所 *str1 const 空所 *str2 size_tNS)。

戻り値: 2つのメモリブロック( NS バイト)は等しい;それ以外の場合は、最初の不一致のバイトペア間の差を返します(バイトはunsigned charオブジェクトとして解釈され、intにプロモートされます)。

戻り値 説明
memcmp( Hello World、Hello World、5 )。 0 最初の5文字は同じです。
memcmp( Hello 0 0 0″、Hello 0 World、8 )。 負の整数 最初の6文字は同じですが、7番目の文字は異なります。ここで比較は止まらない strncmp() 「 0」文字を取得するとき。
memcmp( Hello World、Hello World、11 )。 負の整数 最初の文字列(「H」)の最初の一致しない文字のASCII値が、2番目の文字列(「h」)よりも小さい

例:

以下は、説明したすべての関数のCコード例です。

01/*stringCompare.c*/
02
03#含む
0404#含む
05
06int主要(()。
07{{
08。 printf (('strcmp('こんにちは世界'、'こんにちは世界')=>%dNS' strcmp (( 'こんにちは世界''こんにちは世界' )。)。;
09。 printf (('strcmp('こんにちは'、'こんにちは\0世界')=>%dNS' strcmp (( 'こんにちは''こんにちは 0世界' )。)。;
10printf (('strcmp('こんにちは世界'、'こんにちは世界')=>%dNS' strcmp (( 'こんにちは世界''こんにちは世界' )。 )。;
十一printf (('strcmp('こんにちは\0\0\0'、'こんにちは\0世界')=>%dNS' strcmp (( 'こんにちは 0 0 0''こんにちは 0世界' )。)。;
12
13printf (('NS---------------NS')。;
14
15printf (('strncmp('こんにちは世界'、'こんにちは世界'、5)=>%dNS' strncmp (( 'こんにちは世界''こんにちは世界'5 )。)。;
16printf (('strncmp('こんにちは'、'こんにちは\0世界'、5)=>%dNS' strncmp (( 'こんにちは''こんにちは 0世界'5 )。)。;
17printf (('strncmp('こんにちは\0\0\0'、'こんにちは\0世界'、8)=>%dNS' strncmp (( 'こんにちは 0 0 0''こんにちは 0世界'8 )。)。;
18printf (('strncmp('こんにちは世界'、'こんにちは世界'、5)=>%dNS' strncmp (( 'こんにちは世界''こんにちは世界'5 )。)。;
19
20printf (('NS---------------NS')。;
21
22printf (('strcasecmp('こんにちは世界'、'こんにちは世界')=>%dNS'strcasecmp(( 'こんにちは世界''こんにちは世界' )。)。;
2. 3printf (('strcasecmp('こんにちは'、'こんにちは\0世界')=>%dNS'strcasecmp(( 'こんにちは''こんにちは 0世界' )。)。;
24printf (('strcasecmp('こんにちは世界'、'こんにちは世界')=>%dNS'strcasecmp(( 'こんにちは世界''こんにちは世界' )。)。;
25
26printf (('NS---------------NS')。;
27
28printf (('strncasecmp('こんにちは世界'、'こんにちは世界'、5)=>%dNS'strncasecmp(( 'こんにちは世界''こんにちは世界'5 )。 )。;
29printf (('strncasecmp('こんにちは'、'こんにちは\0世界'、5)=>%dNS'strncasecmp(( 'こんにちは''こんにちは 0世界'5 )。)。;
30printf (('strncasecmp('こんにちは\0\0\0'、'こんにちは\0世界'、8)=>%dNS'strncasecmp(( 'こんにちは 0 0 0''こんにちは 0世界'8 )。)。;
31printf (('strncasecmp('こんにちは世界'、'こんにちは世界'、5)=>%dNS'strncasecmp(( 'こんにちは世界''こんにちは世界'5 )。)。;
32
33printf (('NS---------------NS')。;
3. 4
35printf (('memcmp('こんにちは世界'、'こんにちは世界'、5)=>%dNS' memcmp (( 'こんにちは世界''こんにちは世界'5 )。 )。;
36printf (('memcmp('こんにちは\0\0\0'、'こんにちは\0世界'、8)=>%dNS' memcmp (( 'こんにちは 0 0 0''こんにちは 0世界'8 )。)。;
37printf (('memcmp('こんにちは世界'、'こんにちは世界'、11)=>%dNS' memcmp (( 'こんにちは世界''こんにちは世界'十一 )。)。;
38
39戻る 0; 40}

結論:

したがって、このチュートリアルでは、文字列をさまざまな方法で比較する方法を見てきました。これまで見てきたように、stringCompare()関数は等しくない文字列に対して-1を返しますが、これを変更して、不一致の文字のASCII値を返すようにすることができます。あなたはあなたに最も適しているあなたのコードでそれを使うことができます。