文字列の操作

文字列の長さ取得

strlen.c

 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
/*
  string.h [strlen]
  
  書式: size_t strlen(const char *s)
  機能: 文字列の長さを取得
  引数: const char *s: 対象となる文字列
  戻り値: 文字列の長さを返す.
*/

/*
  文末の [\0] は含まない.
  全角文字があると, 2 バイトとして扱う. もし, 全角文字と半角文字が混在した
  文字数をカウントしたい場合には, mblen() か, mbstowcs() を使ったほうがよい.
*/

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

int main(void){
  char *s = "HelloWorld";
  int len;

  len = strlen(s);

  printf("文字列の長さ: %d\n", len);

  return 0;
}

strlen.c の実行結果は:

[cactus:~/code_c/refer]% ./strlen
文字列の長さ: 10

文字列の連結

strcat.c

 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
/*
  string.h [strcat]
  
  書式: char* strcat(char *s1, const char *s2)
  機能: 文字列のを連結
  引数:	char *s1: 連結先の文字列
        const char *s2: 連結元の文字列
  戻り値: 連結先の文字列を返す.
*/

/*
  連結先の文字列 s1 には, 連結元の文字列 s2 の '\0' まで連結されるため,
  s1 の文字数 + s2 の文字数 + 1 のサイズが必要になる.
  sprintf() で連結するほうが簡単な場合もある.
*/

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

int main(void){
  char s1[11] = "Hello";
  char *s2 = "World";

  strcat(s1, s2);

  printf("連結文字列: %s\n", s1);

  return 0;
}

strcat.c の実行結果は:

[cactus:~/code_c/refer]% ./strcat
連結文字列: HelloWorld

文字列の比較

strcmp.c

 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
32
33
34
35
36
37
38
/*
  string.h [strcmp]
  
  書式: int strcmp(const char *s1, const char *s2)
  機能: 文字列の比較
  引数: const char *s1: 比較する文字列
        const char *s2: 比較する文字列
  戻り値:
          s1 < s2: 負の値
	  s1 = s2: 0
	  s1 > s2: 正の値
*/

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

int main(void){
  char *s1 = "abc";
  char *s2 = "abc";
  char *s3 = "ABC";
  int ret;

  printf("%s と %s の比較\n", s1, s2);
  ret = strcmp(s1, s2);
  if(ret == 0)
    printf("文字列が一致した\n");
  else
    printf("文字列が異なる\n");

  printf("%s と %s の比較\n", s1, s3);
  ret = strcmp(s1, s3);
  if(ret == 0)
    printf("文字列が一致した\n");
  else
    printf("文字列が異なる\n");

  return 0;
}

strcmp.c の実行結果は:

[cactus:~/code_c/refer]% ./strcmp
abc と abc の比較
文字列が一致した
abc と ABC の比較
文字列が異なる

文字列のコピー

strcpy.c

 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
/*
  string.h [strcpy]
  
  書式: char* strcpy(char *dst, const char *src)
  機能: 文字列のコピー
  引数: char *dst: コピー先となる文字列
        const char *src: コピー元となる文字列
  戻り値: コピー先文字列のポインタを返す.
*/

/*
  [\0] までがコピーされるため, 引数 dst には [コピー元文字数 + 1]
  のサイズが必要.
*/

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

int main(void){
  char src[10] = "ABCDEFG";
  char dst[10];
  strcpy(dst, src);
  printf("コピーされた文字列: %s\n", dst);

  return 0;
}

strcpy.c の実行結果は:

[cactus:~/code_c/refer]% ./strcpy
コピーされた文字列: ABCDEFG

文字数指定の文字列連結

strncat.c

 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
/*
  string.h [strncat]
  
  書式: char* strncat(char *s1, const char *s2, size_t n)
  機能: 文字列を指定した文字列の連結
  引数: char *s1: 連結先の文字列
        const char *s2: 連結元の文字列
	size_t n: 連結する文字数
  戻り値: 連結先の文字列のポインタを返す.
*/

/*
  指定した文字数 (n) より, 連結元 (s2) の文字数が小さい場合は, [\0]
  までが連結される.
  指定した文字数 (n) より, 連結元 (s2) の文字数が大きい場合は, [\0]
  が追加される.
*/

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

int main(void){
  char s1[100] = "ABCDE";
  char *s2 = "123456789";
  
  strncat(s1, s2, 6);
  printf("連結文字列: %s\n", s1);

  return 0;
}

strncat.c の実行結果は:

[cactus:~/code_c/refer]% ./strncat
連結文字列: ABCDE123456

文字数指定の文字列比較

strncmp.c

 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
32
33
34
35
36
37
38
/*
  string.h [strncmp]
  
  書式: int strncmp(const char *s1, const char *s2, size_t n)
  機能: 文字列を指定した文字列の比較
  引数: const char *s1: 比較する文字列
        const char *s2: 比較する文字列
	size_t n: 比較する先頭からの文字数
  戻り値:
          s1 < s2: 負の値
	  s1 = s2: 0
	  s1 > s2: 正の値
*/

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

int main(void){
  char *s1 = "ABCD";
  char *s2 = "ABC123";
  int ret;

  printf("%s と %s の 3 文字目までの比較\n", s1, s2);
  ret = strncmp(s1, s2, 3);
  if(ret == 0)
    printf("文字列が一致した\n");
  else
    printf("文字列が異なる\n");

  printf("%s と %s の 5 文字目までの比較\n", s1, s2);
  ret = strncmp(s1, s2, 5);
  if(ret == 0)
    printf("文字列が一致した\n");
  else
    printf("文字列が異なる\n");

  return 0;
}

strncmp.c の実行結果は:

[cactus:~/code_c/refer]% ./strncmp
ABCD と ABC123 の 3 文字目までの比較
文字列が一致した
ABCD と ABC123 の 5 文字目までの比較
文字列が異なる

文字数指定の文字列コピー

strncpy.c

 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
32
33
34
35
/*
  string.h [strncpy]
  
  書式: char* strncpy(char *dst, const char *src, size_t n)
  機能: 文字列を指定した文字列のコピー
  引数: char *dst: コピー先となる文字列
        const char *src: コピー元となる文字列
	size_t: コピーする文字数
  戻り値: コピー先文字列のポインタを返す.
*/

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

int main(void){
  char dst[100] = "ABCDEFG";
  char *src = "12345";
  
  strncpy(dst, src, 3);
  printf("コピーされた文字列: %s\n", dst);

  strncpy(dst, src, 5);
  printf("コピーされた文字列: %s\n", dst);

  strncpy(dst, src, 6);
  printf("コピーされた文字列: %s\n", dst);


  return 0;
}
/*
  最初は, 3 文字のみコピーなので [ABCDEFG] という文字列に 3 文字のみ
  上書きされる.
  次は, 6 文字コピーのため, [\0] が追加されて上書きされているわけ.
*/

strncpy.c の実行結果は:

[cactus:~/code_c/refer]% ./strncpy
コピーされた文字列: 123DEFG
コピーされた文字列: 12345FG
コピーされた文字列: 12345

文字列内の文字を検索

strchr.c

 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
/*
  string.h [strchr]
  
  書式: char* strchr(const char *s, int c)
  機能: 文字列内の文字を検索
  引数: const char *s: 検索元の文字列
        int c: 検索する文字
  戻り値: 検索文字を最初に発見した位置のポインタを返し,
          発見出来なかったときは, NULL を返す.
*/

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

int main(void){
  char *s = "ABCDEFGHIJKLMN";
  int c = 'L';
  char *ret;

  ret = strchr(s, c);

  if(ret != NULL)
    printf( "%c を index %d 番目に発見した\n", c, (int)(ret-s) );
  else
    printf("%c は発見できない\n", c);

  return 0;
}

strchr.c の実行結果は:

[cactus:~/code_c/refer]% ./strchr
L を index 11 番目に発見した

文字列内の文字を後方検索

strrchr.c

 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
/*
  string.h [strchr]
  
  書式: char* strrchr(const char *s, int c)
  機能: 文字列内の文字を後ろから検索 ( <-- 後ろから検索する)
  引数: const char *s: 検索元の文字列
        int c: 検索する文字
  戻り値: 検索文字を最初に発見した位置のポインタを返し,
          発見出来なかったときは, NULL を返す.
*/

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

int main(void){
  char *s = "ABCDEFGABCDEFG";
  int c = 'C';
  char *ret;

  ret = strrchr(s, c);

  if(ret != NULL)
    printf( "%c を index %d 番目に発見した\n", c, (int)(ret-s) );
  else
    printf("%c は発見できない\n", c);

  return 0;
}

strrchr.c の実行結果は:

[cactus:~/code_c/refer]% ./strrchr
C を index 9 番目に発見した

文字列内の文字列を検索

strstr.c

 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
/*
  string.h [strstr]
  
  書式: char* strstr(const char *s1, const char *s2)
  機能: 文字列内の文字列を検索
  引数: const char *s1: 検索対象の文字列
        const char *s2: 検索する文字列
  戻り値: 検索文字列 (s2) を最初に発見した位置のポインタを返し,
          発見出来なかったときは, NULL を返す.
*/

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

int main(void){
  char *s1 = "ABCD123ABCD123";
  char *s2 = "123";

  char *ret;

  ret = strstr(s1, s2);

  if(ret != NULL)
    printf( "%s を index %d 番目に発見した\n", s2, (int)(ret-s1) );
  else
    printf("%s は発見できない\n", s2);

  return 0;
}

strstr.c の実行結果は:

[cactus:~/code_c/refer]% ./strstr
123 を index 4 番目に発見した

文字列内を文字群で検索

strpbrk.c

 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
/*
  string.h [strpbrk]
  
  書式: char* strpbrk(const char *s1, const char *s2)
  機能: 文字列内から文字群で検索
  引数: const char *s1: 検索対象の文字列
        const char *s2: 検索する文字群
  戻り値: 検索文字群 (s2) のどれか 1 文字を最初に発見した位置のポインタ
          を返し,
          発見出来なかったときは, NULL を返す.
*/

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

int main(void){
  char *s1 = "ABCDEFGHIJKLMN";
  char *s2 = "TEST";

  char *ret;

  ret = strpbrk(s1, s2);

  if(ret != NULL)
    printf( "%s の %c を index %d 番目に発見した\n", s2, *ret, (int)(ret-s1) );
  else
    printf("%s は発見できない\n", s2);

  return 0;
}

strpbrk.c の実行結果は:

[cactus:~/code_c/refer]% ./strpbrk
TEST の E を index 4 番目に発見した

文字列内から文字群を含む先頭長を取得

strspn.c

 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
/*
  string.h [strspn]
  
  書式: size_t strspn(const char *s1, const char *s2)
  機能: 文字列内から文字群を含む先頭からの長さを取得
  引数: const char *s1: 検索対象の文字列
        const char *s2: 検索する文字群
  戻り値: 文字群 (s2) が含まれた, 文字列 (s1) の先頭からの長さを返す.
*/

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

int main(void){
  char *s1 = "13242341ABCD";
  char *s2 = "1234DCBA";

  int len;

  len = strspn(s1, s2);

  printf("文字群を含む先頭部分の長さ: %d\n", len);

  return 0;
}

strspn.c の実行結果は:

[cactus:~/code_c/refer]% ./strspn
文字群を含む先頭部分の長さ: 12

文字列内から文字群を含まない先頭長を取得

strcspn

 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
/*
  string.h [strcspn]
  
  書式: size_t strcspn(const char *s1, const char *s2)
  機能: 文字列内から文字群を含まない先頭からの長さを取得
  引数: const char *s1: 検索対象の文字列
        const char *s2: 検索する文字群
  戻り値: 文字群 (s2) を含まない, 文字列 (s1) の先頭からの長さを返す.
*/

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

int main(void){
  char *s1 = "DACBBC2ABC";
  char *s2 = "1234B";

  int len;

  len = strcspn(s1, s2);

  printf("文字群を含まない先頭部分の長さ: %d\n", len);

  return 0;
}

strcspn.c の実行結果は:

[cactus:~/code_c/refer]% ./strcspn
文字群を含まない先頭部分の長さ: 3

文字列を区切り文字群で分解

strtok.c

 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
32
33
34
35
36
37
38
39
/*
  string.h [strtok]
  
  書式: char* strtok(char *s1, const char *s2)
  機能: 文字列を指定区切り文字群で分解
  引数: char *s1: 分解する文字列
        const char *s2: 区切り文字群
  戻り値: 区切られた文字列 (トークン) があれば, 先頭ポインタを返し,
          区切られた文字列 (トークン) がなければ, NULL を返す.
*/
/*
  1 回目は, 分解する文字列 (s1) を指定し, トークンを取得する,
  2 回目以降は, s1 に NULL を指定し, トークンを取得する,
  NULL を返してきた場合に終了する.
  分解する文字列がトークンに分解する際に, 区切り文字があった箇所は,
  [\0] に置き換えられるので注意が必要.
*/

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

int main(void){
  char s1[] = "this is a pen. Hello-World...";
  char s2[] = " -."; /* 空白 + ハイフン + ピリオド */
  char *tok;

  tok = strtok(s1, s2);
  while(tok != NULL){
    printf("%s\n", tok);
    tok = strtok(NULL, s2); /* 2 回目以降 */
  }
  
  return 0;
}

/*
  空白, ハイフン, ピリオドが区切り文字のため, それらは取得されない.
  区切り文字は順不同で複数の文字を指定することができる.
*/

strtok.c の実行結果は:

[cactus:~/code_c/refer]% ./strtok
this
is
a
pen
Hello
World