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';
}
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';
}
『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';
}
--
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/6766872
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック