アフィリエイト広告を利用しています

広告

posted by fanblog

2017年10月03日

《その63》 strcmp関数,strncmp関数(p.314演習8-11)


strcmp関数,strncmp関数

strcmp関数や strncmp関数は、<cstring>ヘッダで提供されています。


【 strcmp関数 】

ヘッダ : #include <cstring>
形 式 : int strcmp(const char* s1, const char* s2);
解 説 : s1 が指す文字列と s2 が指す文字列の大小関係(先頭から順に 1文字ずつ unsigned char型
の値として比較していき、異なる文字が出現したときに、それらの文字の対に成立する大小
関係とする)の比較を行う。
返却値 : 等しければ 0、s1 が s2 より大きければ正の整数値、s1 が s2 より小さければ負の整数値
を返す。


【 strncmp関数 】

ヘッダ : #include <cstring>
形 式 : int strncmp(const char* s1, const char* s2, size_t n);
解 説 : s1 が指す文字の配列と s2 が指す文字の配列の先頭 n文字までの大小関係の比較を行う。
ナル文字以降の文字は比較しない
返却値 : 等しければ 0、s1 が s2 より大きければ正の整数値、s1 が s2 より小さければ負の整数値
を返す。


※ 上の、strcmp関数,strncmp関数 の解説では、
strcmp関数 …「 s1 が指す文字列と s2 が指す文字列の大小関係 」
strncmp関数 …「 s1 が指す文字の配列と s2 が指す文字の配列の先頭 n文字までの大小関係 」
となっています。
文字列」,「文字の配列」 と、違う表現を使っている理由は、二つの関数の動作をみてみることで
理解できました。


◆ strcmp関数の動作をみてみます。
#include <cstring>
#include <iostream>
using namespace std;

int main(void)
{
char str1[] = {'x', 'y', '\0'}; // str1, str2 は終端に '\0'があるので文字列
char str2[] = {'x', 'y', '\0'};

char str3[] = {'x', 'y'}; // str3, str4 は文字列ではない文字の配列
char str4[] = {'x', 'y'};

cout << strcmp(str1, str2) << '\n';
cout << strcmp(str3, str4) << '\n';
}

b08_1101.png

str1 と str2 は等しいので、結果の 0 は当然です。
str3 と str4 も等しいのですが、文字列ではないため終端に '\0'がないので、違いがあるところまで
スキャンしてしまうようです。


◆ strncmp関数の動作をみてみました。

char str1[] = {'x', 'y'};
char str2[] = {'x', 'y', 'z'};
cout << strncmp(str1, str2, 2) << '\n'; // 結果は 0

char str3[] = {'x', 'y'};
char str4[] = {'x', 'y', 'z'};
cout << strncmp(str3, str4, 3) << '\n'; /* str3 の 3文字目の位置に
何が入っているかで結果が異なる。
*/
char str5[] = { 'x', '\t', 'a' };
char str6[] = { 'x', '\n'};
cout << strncmp(str5, str6, 2) << '\n'; // 結果は -1

char str7[] = {'x', 'y', 'a', 'a'};
char str8[] = {'x', 'y', '\0', 'b'};
cout << strncmp(str7, str8, 4) << '\n'; // 結果は 1

char str9[] = {'x', 'y', '\0', 'a'};
char str10[] = {'x', 'y', 'b', 'b'};
cout << strncmp(str9, str10, 4) << '\n'; // 結果は -1

char str11[] = {'x', 'y', '\0', 'a'};
char str12[] = {'x', 'y', '\0', 'b'};
cout << strncmp(str11, str12, 4) << '\n'; // 結果は 0
}


新版明解C++入門編 p.314 演習8-11
 p.312 で学習した strcmp関数および strncmp関数と同等な関数を作成せよ。

『strcmp関数と同等な関数』
 strcmp関数と同等な関数の名前を strcmp_eq とします。

// p314_演習8-11_strcmp
#include <iostream>
using namespace std;

int strcmp_eq(const char* s1, const char* s2)
{
while (*s1 != 0 && *s2 != 0) {
if (*s1 != *s2)
break;
s1++;
s2++;
}
int k = 0;
if (*s1 > *s2)
k = 1;
if (*s1 < *s2)
k = -1;
return k;
}


int main(void)
{
char str1[] = "ABCD";
char str2[] = "ABCD";
char str3[] = "AACD";
char str4[] = "ABZ";
char str5[] = "ABCDE";
char str6[] = "AB";

cout << strcmp_eq(str1, str2) << '\n';
cout << strcmp_eq(str1, str3) << '\n';
cout << strcmp_eq(str1, str4) << '\n';
cout << strcmp_eq(str1, str5) << '\n';
cout << strcmp_eq(str1, str6) << '\n';
}

b08_111.png



『strncmp関数と同等な関数』
 strncat関数と同等な関数の名前を strncmp_eq とします。

// p314_演習8-10_strncat
#include <iostream>
using namespace std;

int strncmp_eq(const char* s1, const char* s2, size_t n)
{
while (*s1 != 0 && *s2 != 0 && n - 1 > 0) {
if (*s1 != *s2)
break;
s1++;
s2++;
n--;
}
int k = 0;
if (*s1 > *s2)
k = 1;
if (*s1 < *s2)
k = -1;
return k;
}


int main(void)
{
char str1[] = {'x', 'y'};
char str2[] = {'x', 'y', 'z'};
cout << strncmp_eq(str1, str2, 2) << '\n';

char str3[] = {'x', 'y'};
char str4[] = {'x', 'y', 'z'};
cout << strncmp_eq(str3, str4, 3) << '\n'; /* str3 の 3文字目の位置に
何が入っているかで結果が異なる。
*/
char str5[] = { 'x', '\t', 'a' };
char str6[] = { 'x', '\n'};
cout << strncmp_eq(str5, str6, 2) << '\n';

char str7[] = {'x', 'y', 'a', 'a'};
char str8[] = {'x', 'y', '\0', 'b'};
cout << strncmp_eq(str7, str8, 4) << '\n';

char str9[] = {'x', 'y', '\0', 'a'};
char str10[] = {'x', 'y', 'b', 'b'};
cout << strncmp_eq(str9, str10, 4) << '\n';

char str11[] = {'x', 'y', '\0', 'a'};
char str12[] = {'x', 'y', '\0', 'b'};
cout << strncmp_eq(str11, str12, 4) << '\n';
}

b08_112.png


新版 明解C 入門編 (明解シリーズ)

新品価格
¥2,916から
(2017/8/30 21:02時点)









--
この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/6766872
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


検索
<< 2018年08月 >>
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
プロフィール
こうすけさんの画像
こうすけ

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


×

この広告は30日以上新しい記事の更新がないブログに表示されております。