Nodachisoft Nodachi Sword Icon
  
@あまじ✎ 2021年3月12日に更新

第2章62 文字列を操作する関数

イチからゲーム作りで覚えるC言語
第2章61 文字列で日本語(マルチバイト)を扱う : PREV
NEXT : 第2章63 自作ライブラリDLLを作る :

概要

文字列を操作するための便利な関数達の使い方と使用例を確認していきます。

C言語では、文字列のコピーや、一部抽出、検索などを関数を使って行うことができます。

C言語標準で用意されている文字列を扱う関数がまとまっている string.h についていくつか主要なものを確認していきます。

文字列の比較

strcmp 関数を使うことで、二つの文字列が一致しているかを確認できます。

 
strcmp定義
#include <stdio.h>
#include <string.h>
int main(){
    const char name[64];
    printf("王様「名前をなんという?」\n");
    printf("名前を入力して Enter キー: ");
    scanf("%63s", name);
    if ( strcmp(name, "王様") == 0 ) {
        printf("OH..\n");
    } else {
        printf("%s!\n", name);
    }
}

実行すると、名前の入力を求められるので、「王様」と入れると 下のような結果になります。

結果
王様「名前をなんという?」
名前を入力して Enter キー: 王様
OH...

「王様」以外を入力すると、〇〇となります。

strcmp 関数は下の用に定義されています。

strcmp定義
int strcmp (const char* str1, const char* str2);
  • 1番目の引数 と2番目の引数に比較したい文字列を入れます
  • 文字列が一致したら 0 を返します。

文字列のコピー

ある文字列から、一部を別の文字列(ポインタ)にコピーするには、strcpy 関数を使います。

 
strcpy定義
#include <stdio.h>
#include <string.h>
int main(){
    char player[3][64];
    char input[64];
    for ( int i = 0 ; i < 3 ; i++ ) {
        printf("%d 人目の名前を入力して Enter キー:", i );
        scanf("%63s", input);
        strcpy(player[i], input);
    }
    for ( int i = 0 ; i < 3 ; i++ ) {
        printf("%d 人目の名前は「%s」ですね!\n", i, player[i]);
    }
}

実行すると、名前の入力を3人分求められます。適当に入力した結果は以下になります。

結果
1 人目の名前を入力して Enter キー:ぷらんく
2 人目の名前を入力して Enter キー:豆盗賊
3 人目の名前を入力して Enter キー:Slime
1 人目の名前は「ぷらんく」ですね!
2 人目の名前は「豆盗賊」ですね!
3 人目の名前は「Slime」ですね!

strcpy 関数を使用することで、一次的に入力した結果をもつ name 変数から、 名前を格納するために用意した変数 player の2次元配列にコピーしています。

strcpy 関数は下の用に定義されています。

strcpy定義
char *strcpy(char * s1, const char * s2);
  • 第一引数にはコピー先のchar型ポインタ変数を渡します
  • 第二引数にはコピー元のchar型ポインタ変数を渡します。
  • 戻り値で、コピー先の char 型ポインタ変数が返ってきます。

終端文字列まで含めてコピーしてくれるので、自分で '\0' を末尾にセットしてあげる必要はありません。

類似した関数でコピーする長さを指定できる strncpy 関数もあります。

文字列の長さを得る

文字列の長さを確認するためには strlen 関数を使います。 ただし、日本語等の文字列を含んだマルチバイトのカウントは上手くいかないので、 ワイド文字列を使った、wcslen 関数を使うと良いです。

結果は以下になります。

 
strlen定義
#include <stdio.h>
#include <string.h>
int main(){
    char input[64];
    printf("名前を入力して Enter キー: ");
    scanf("%63s", input);
    printf("名前「%s」の長さは %d 文字ですね!\n", input,  strlen(input));
}

結果は以下になります。

結果
名前を入力して Enter キー: planc
名前「planc」の長さは 5 文字ですね!

文字列の長さを調べる関数 strlen の定義は下の通りです。

strlen
size_t strlen(const char *s);
  • 第一引数に、長さを確認したい文字列へのポインタを渡します
  • 戻り値で、長さ(バイト数)が得られます

文字列の検索

文字列から文字の検索(strchr関数)

strchr関数を使い、ASCII CODE で書かれた文字列から、文字を検索できます。 ワイド文字列に対して同じように検索をかけたいときは、wcsstr 関数 が利用できます。

strchr 関数の定義を確認してみます。

 
strchr
char *strchr(const char *s, int c);
  • 文字 s ポインタから終端文字列 '\0' までの文字列を対象に、文字 c が入っているかを比較確認していき、最初に一致した位置(ポインタ)を return で返します。
  • 見つからなければ NULL を返します。

例として「planc chan desu.」という文字列から文字「c」を検索してみます。

 
strchr_ex.c
#include <stdio.h>
#include <string.h>
int main(){
    char *search = "planc chan desu.";
    char *position;
    position = strchr(search, 'c');
    printf("文字列「%s」の中で文字 c は%d 文字目で最初に出てきます。\n", search, position - search);
}

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

実行結果
文字列「planc chan desu.」の中で文字 c は 4 文字目で最初に出てきます。

文字列から文字の検索(memchr関数)

memchr関数を使い、ASCII CODE で書かれた文字列から、文字を検索できます。 使い方は strchr 関数とほぼ同じですが、こちらは、検索する範囲を指定できます

ワイド文字列に対しては wmemchr 関数で同様の検索ができます。

memchr 関数の定義を確認してみます。

 
memchr
void *memchr(const void *s, int c, size_t n);
  • 文字 s ポインタから n の長さの範囲で、もしくは終端文字列 '\0' にたどり着くまでの範囲の文字列を対象に、文字 c が入っているかを比較確認していき、最初に一致した位置(ポインタ)を return で返します。
  • 見つからなければ NULL を返します。

例として「planc,4,3,2,55,102」というカンマ区切りのデータ(CSVデータ)から 1つめの目の「,」の位置を抽出してみます。

 
search.c
#include <stdio.h>
#include <string.h>
int main(){
    const char search[] = "planc,4,3,2,55,102";
    const char divisor = ',';
    char *index;
    index = memchr( search, divisor, strlen( search ));
    printf("一つ目のカンマの位置は %d バイト目。\n", (index-search) );
    printf("二つ目のカンマからの文字列は「%s」です。\n", index);
}

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

実行結果
一つ目のカンマの位置は 5 バイト目。
二つ目のカンマからの文字列は「,4,3,2,55,102」です。

他の様々な文字列操作のための関数は必要に応じて確認していきましょう。

参考文献

イチからゲーム作りで覚えるC言語
第2章61 文字列で日本語(マルチバイト)を扱う : PREV
NEXT : 第2章63 自作ライブラリDLLを作る :
 
 
送信しました!

コメント、ありがとうございます。

なんかエラーでした

ごめんなさい。エラーでうまく送信できませんでした。ご迷惑をおかけします。しばらくおいてから再度送信を試していただくか、以下から DM などでご連絡頂ければと思います。

Twitter:@NodachiSoft_jp
お名前:
 
連絡先:
 
メッセージ:
 
戻る
内容の確認!

以下の内容でコメントを送信します。よろしければ、「送信」を押してください。修正する場合は「戻る」を押してください

お名前:
 
連絡先:
 
メッセージ:
 
Roboto からの操作ではないという確認のため確認キーを入れてください。
確認キー=95
戻る
 / 
送信確認へ
コメント欄
コメント送信確認へ

関連ありそうな記事(5件)です!

第4章3 C言語コンソール上で迷路脱出プログラム・迷路の自動生成

#C11仕様#C言語#ゲームプログラミング✎ 2021-05-15
C言語のコンソールゲームで迷路脱出ゲームプログラムの作り方を確認します。迷路は自動生成されます
広告領域
追従 広告領域
目次
第2章62 文字列を操作する関数
第2章62 文字列を操作する関数
概要
概要
文字列の比較
文字列の比較
文字列のコピー
文字列のコピー
文字列の長さを得る
文字列の長さを得る
文字列の検索
文字列の検索
文字列から文字の検索(strchr関数)
文字列から文字の検索(strchr関数)
文字列から文字の検索(memchr関数)
文字列から文字の検索(memchr関数)
参考文献
参考文献
Nodachisoft © 2021