
文字列を操作するための便利な関数達の使い方と使用例を確認していきます。
C言語では、文字列のコピーや、一部抽出、検索などを関数を使って行うことができます。
C言語標準で用意されている文字列を扱う関数がまとまっている string.h についていくつか主要なものを確認していきます。
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 関数は下の用に定義されています。
int strcmp (const char* str1, const char* str2);
ある文字列から、一部を別の文字列(ポインタ)にコピーするには、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 関数は下の用に定義されています。
char *strcpy(char * s1, const char * s2);
終端文字列まで含めてコピーしてくれるので、自分で '\0' を末尾にセットしてあげる必要はありません。
類似した関数でコピーする長さを指定できる strncpy 関数もあります。
文字列の長さを確認するためには strlen 関数を使います。 ただし、日本語等の文字列を含んだマルチバイトのカウントは上手くいかないので、 ワイド文字列を使った、wcslen 関数を使うと良いです。
結果は以下になります。
#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 の定義は下の通りです。
size_t strlen(const char *s);
strchr関数を使い、ASCII CODE で書かれた文字列から、文字を検索できます。 ワイド文字列に対して同じように検索をかけたいときは、wcsstr 関数 が利用できます。
strchr 関数の定義を確認してみます。
char *strchr(const char *s, int c);
例として「planc chan desu.」という文字列から文字「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関数を使い、ASCII CODE で書かれた文字列から、文字を検索できます。 使い方は strchr 関数とほぼ同じですが、こちらは、検索する範囲を指定できます。
ワイド文字列に対しては wmemchr 関数で同様の検索ができます。
memchr 関数の定義を確認してみます。
void *memchr(const void *s, int c, size_t n);
例として「planc,4,3,2,55,102」というカンマ区切りのデータ(CSVデータ)から 1つめの目の「,」の位置を抽出してみます。
#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」です。
他の様々な文字列操作のための関数は必要に応じて確認していきましょう。
コメント、ありがとうございます。
ごめんなさい。エラーでうまく送信できませんでした。ご迷惑をおかけします。しばらくおいてから再度送信を試していただくか、以下から DM などでご連絡頂ければと思います。
Twitter:@NodachiSoft_jpお名前:以下の内容でコメントを送信します。よろしければ、「送信」を押してください。修正する場合は「戻る」を押してください
お名前: