目的から逆引き!図解付き!C言語の文字列操作関数まとめ

C言語で文字列を扱う際に覚えておくと便利なのが文字列操作関数です。このページでは目的別に使用できる文字列操作関数とその使用方法について解説していきます。

文字列の文字数を取得する

文字列の文字数を取得することができるのはstrlen関数です。

strlen関数

strlen関数の定義ファイル、書式は下記の通りです。

strlen関数

#include <string.h>

size_t strlen(const char* str)

strlen関数は文字列str1の長さを返却します。ヌル文字(\0)はカウントしません。

strlen関数の使用例

strlen関数を使用したプログラムの例です。

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

#define MAX_CHAR_NUM 10

int main(void){
    char *str1 = "hitotsume";
    size_t len1;

    /* 文字列の長さ取得 */
    len1 = strlen(str1);
    printf("str1 = %s, len1 = %lu\n", str1, len1);

    return 0;
}

実行結果は下のようになります。

str1 = hitotsume, len1 = 9

文字列をコピーする

文字列のコピーすることができるのはstrcpy関数です。

strcpy関数

strpy関数の定義ファイル、関数定義は下記の通りです。

strcpy関数

#include <string.h>

char* strcpy(char* str1, const char* str2)

strcpyは文字列str2を、str1の指す領域にコピーします。

strcpy関数の使用例

strcpy関数を使用したプログラムの例です。

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

#define MAX_CHAR_NUM 10

int main(void){
    char str1[MAX_CHAR_NUM];
    char str2[MAX_CHAR_NUM];

    /* 文字列コピー */
    strcpy(str1, "hitotsume");
    printf("str1 = %s\n", str1);
    printf("\n");

    strcpy(str2, str1);
    printf("str1 = %s\n", str1);
    printf("str2 = %s\n", str2);
    printf("\n");

    strcpy(str2, "futatsume");
    printf("str1 = %s\n", str1);
    printf("str2 = %s\n", str2);
    printf("\n");

    return 0;
}

実行結果は下のようになります。

str1 = hitotsume

str1 = hitotsume
str2 = hitotsume

str1 = hitotsume
str2 = futatsume

スポンサーリンク

文字列を比較する

文字列の比較することができるのはstrcmp関数です。

strcmp関数

strcmp関数の定義ファイル、書式は下記の通りです。

strcmp関数

#include <string.h>

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

strcmpは引数で指定された2つの文字列の比較を行います。先頭から\0まで1文字ずつ比較を行い、全て同じ文字であれば0を、str1の文字のアスキーコードの方が大きければ正の数を、st1の文字のアスキーコードの方が小さければ負の数をそれぞれ返却します。

strcmp関数の使用例

strcmp関数を使用したプログラムの例です。

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

#define MAX_CHAR_NUM 10

int main(void){
    char str1[MAX_CHAR_NUM];
    char str2[MAX_CHAR_NUM];
    
    int ret;

    strcpy(str1, "ichia");
    strcpy(str2, "ichib");

    /* 文字列比較 */
    ret = strcmp(str1, str2);
    printf("result = %d\n", ret);

    strcpy(str1, "ichi");
    strcpy(str2, "ichia");

    /* 文字列比較 */
    ret = strcmp(str1, str2);
    printf("result = %d\n", ret);

    strcpy(str1, "ichia");
    strcpy(str2, "ichi");

    /* 文字列比較 */
    ret = strcmp(str1, str2);
    printf("result = %d\n", ret);

    strcpy(str1, "ichi");
    strcpy(str2, "ichi");

    /* 文字列比較 */
    ret = strcmp(str1, str2);
    printf("result = %d\n", ret);
    return 0;
}

実行結果は下のようになります。

result = -1
result = -97
result = 97
result = 0

文字列を連結(結合)する

文字列を連携することができるのはstrcat関数とsprintf関数です。

strcat関数

strcat関数の定義ファイル、書式は下記の通りです。

strcat関数

#include <string.h>

char* strcat(char* str1, const char* str2)

strcat関数は文字列str1の後ろに文字列str2を結合し、str1の先頭アドレスを返却します。

strcat関数の使用例

strcat関数を用いたプログラムの例です。

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

#define MAX_CHAR_NUM 10

int main(void){
    char str1[MAX_CHAR_NUM];
    char str2[MAX_CHAR_NUM];

    strcpy(str1, "ichi");
    strcpy(str2, "ni");

    /* 文字列連結 */
    strcat(str1, str2);
    printf("str1 = %s\n", str1);
    printf("str2 = %s\n", str2);

    return 0;
}

文字列を検索する

文字列検索することができるのはstrstr関数です。

strstr関数

strcat関数の定義ファイル、書式は下記の通りです。

strcat関数

#include <string.h>

char* strstr(const char* str1, const char* str2)

strstr関数は文字列str1から文字列str2を検索し、最初に見つかった位置(アドレス)を返却します。

見つからなかった場合はNULLを返却します。

strstr関数の使用例

#include 
#include 

#define MAX_CHAR_NUM 10
#define MAX_LINE 5

int main(void){
    char str[MAX_LINE][MAX_CHAR_NUM] = {
        "I am cat",
        "can",
        "melon",
        "calc",
        "orange"
    };
    char search[3] = "ca";
    int i;

    for(i = 0; i < MAX_LINE; i++){
        if(strstr(str[i], search) != NULL) {
            printf("%s\n", str[i]);
        }
    }

    return 0;
}

スポンサーリンク

文字列を分離する(切り離す)

文字列を分離(切り離し)することができるのはstrtok関数です。

strok関数

strcat関数の定義ファイル、書式は下記の通りです。

streak関数

#include <string.h>

char* strtok(char* str1, const char* str2)

strtok関数は文字列str1を文字列str2に含まれる文字で分離する関数です。例えば文字列str2が”,x&”であれば、”,”と”,x”と”&”の文字を境に文字列str1を分離します。

strtok関数には2つの注意点があります。一つ目は、strtok関数の1回目は定義の通りに実行すれば良いですが、2回目以降はstr1にNULLを指定する必要がある点です。二つ目は、実行するたびに第一引数に指定した文字列str1の内容がどんどん変わっていく点です。

strtok関数は検索開始位置から最初に現れる検索文字を”\0″に置き換え、検索開始位置のアドレスを返却します。次に実行されるときは、検索開始位置は、前回”\0″に置き換えた次の文字となります。検索文字が見つからない場合も検索開始位置のアドレスが返却されますが、”\0″への置き換えが行われないため次回実行時はNULLを返却することになります。

strtok関数の使用例

strtok関数を用いたプログラムの例です。

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

#define MAX_CHAR_NUM 10

int main(void){
    char str[MAX_CHAR_NUM] = "a,bc,de,f" ;
    char *ptr;
    int i;

    ptr = strtok(str, ",");
    printf("ptr address = %p\n", ptr);
    printf("ptr string = %s\n", ptr);


    while(ptr != NULL){
        ptr = strtok(NULL, ",");
        printf("ptr address = %p\n", ptr);
        printf("ptr string = %s\n", ptr);
    }

    return 0;
}

strtok関数は使い方が難しいので上記プログラムの動きをみていきましょう。

一回目の分離:strtok(str, “,”)

一回目は第一引数に文字列を指定します。strtok関数を実行すると、第一引数の文字列の先頭から第二引数の文字列に含まれる文字”,”を検索します。”,”が見つかると”,”を”\0″に置き換え、strtok関数は検索を開始した位置のアドレスを返却します。

二回目の分離:strtok(NULL, “,”)

二回目以降は第一引数にNULLを指定します。strtok関数を実行すると、前回置き換えた”\0″の次の文字を検索開始位置として第二引数の文字列に含まれる文字”,”を検索します。”,”が見つかると”,”を”\0″に置き換え、strtok関数は検索を開始した位置のアドレスを返却します。

三回目の分離:strtok(NULL, “,”)

三回目も二回目と同様の動きとなります。

四回目の分離:strtok(NULL, “,”)

四回目も二回目と同じ動きをしようとしますが、第二引数で指定された文字列に含まれる文字”,”を検索開始位置以降では見つけられないため、”\0″への置き換えは行われません。ただし、それでも検索開始位置のアドレスを返却します。

五回目の分離:strtok(NULL, “,”)

前回検索に失敗したため”\0″への置き換えが行われていません。そのため二回目等とは違って「前回置き換えた”\0″の次の文字」というものが存在しないため、検索自体が行われずNULLが返却されます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です