文字列の検索3

strspn関数

strspn関数は、文字列の先頭に、複数の文字のいずれかが続く数を返します。

このページの関数を使用するには#include <string.h>が必要です。


#include 
#include 

int main()
{
	printf("%zu\n", strspn("abcde", "ab"));
	printf("%zu\n", strspn("ababc", "ab"));
	printf("%zu\n", strspn("aabbc", "ab"));
	printf("%zu\n", strspn("zabcd", "ab"));

	getchar();
}
2
4
4
0
size_t strspn(
 const char *s1,
 const char *s2,
);
文字列s1の先頭から、文字列s2のいずれかの文字が出現する文字数を返す。

例えば第二引数が「ab」である場合、文字列の先頭から「a」か「b」のどちらかが出現し続ける個数を数えます。
言い換えれば、先頭から「a」でも「b」でもない文字が出現するまでの文字数-1です。

第二引数は「文字列」というより「文字の組み合わせ」として考えます。
そのため、第二引数の文字列は順序が違っても結果は変わりません。


//どちらも「4」
printf("%zu\n", strspn("aabbc", "ab"));	
printf("%zu\n", strspn("aabbc", "ba"));

strspn関数は、例えば文字列の先頭に不要な文字が含まれる可能性がある場合にそれを除去することができます。


#include <stdio.h>
#include <string.h>

int main()
{
	//空白文字
	const char* space = " \r\n\t";
	
	char* str = "   ABC";	
	printf("%s\n", str + strspn(str, space));

	str = " \n\t\tDEF";
	printf("%s\n", str + strspn(str, space));

	getchar();
}
ABC
DEF

なお、printf関数の変換指定子%zuは、size_t型の指定です。
古いコンパイラで指定できない場合は%u(unsigned int型)を指定します。

strcspn関数

strcspn関数は、文字列の先頭に、複数の文字のいずれかではない文字が連続する数を返します。


#include <stdio.h>
#include <string.h>

int main()
{
	printf("%zu\n", strcspn("abcde", "ab"));
	printf("%zu\n", strcspn("ababc", "ab"));
	printf("%zu\n", strcspn("xabcd", "ab"));
	printf("%zu\n", strcspn("xyzab", "ab"));

	getchar();
}
0
0
1
3
size_t strcspn(
 const char *s1,
 const char *s2,
);
文字列s1の先頭から、文字列s2のいずれでもない文字が出現する文字数を返す。

strcspn関数はstrspn関数と逆の働きをする関数です。
例えば第二引数が「ab」である場合、文字列の先頭に「a」か「b」のどちらでもない文字が出現し続ける個数を数えます。
言い換えれば、先頭から「a」か「b」が出現するまでの文字数-1です。

strcspn関数は例えば使用する文字の種類が限定されている場合に、それが出現するまで文字列を読み捨てる場合などに利用できます。
ただし、目的のデータの手前にそれらの文字種が含まれないことが保証されている必要があるため、使いどころは限られるでしょう。


#include <stdio.h>
#include <string.h>

int main()
{
	//二進数で使用する文字
	const char* bin = "01";
	
	char* str = "binary data: 010010110";	
	printf("%s\n", str + strcspn(str, bin));

	getchar();
}
010010110