C言語入門|文字列操作の基本関数

ここまでで、C言語の文字列が
「char 配列」そのものではなく、
ヌル終端 \0 を前提にした使い方=文化
で成り立っていることが見えてきました。

この文化を前提として、C言語はとても便利な道具をたくさん用意しています。
それが、文字列操作のための標準関数です。

自分で for 文を書いて1文字ずつ処理することもできますが、
文字列文化に沿った処理は、
すでに信頼できる関数として用意されている
と考えてください。

文字列用の標準関数は「文化の集合体」

C言語の標準関数の中には、名前に str が付くものがたくさん登場します。

  • strlen
  • strcmp
  • strcpy
  • strcat
  • strstr

これらはすべて、

  • 先頭アドレスを受け取る。
  • \0 に出会うまで処理を続ける。

という 文字列文化の第1条〜第3条 を前提に設計されています。

そのため、
文字列の業界ルールを理解していないと、安全に使えません。

逆に言えば、
ここまで学んだ内容が身についていれば、
これらの関数はとても強力な味方になります。

文字列操作関数を使うための準備

この節で紹介する関数の多くは、
string.h というヘッダファイルに定義されています。

#include <string.h>

名前に str が付く関数を使うときは、
まずこの1行を書く。
これは C言語プログラマの基本動作 です。

strlen ― 文字列としての長さを知る

文字列の長さを知りたいとき、
配列サイズを見ても意味はありません。

char str[1024] = "C language";

この配列は 1024 バイトありますが、
文字列として使っているのは先頭の一部だけです。

そこで使うのが strlen 関数です。

strlen の書式

size_t strlen(const char* str);
  • 引数
    文字列として使っているメモリ領域の先頭アドレス
  • 戻り値
    先頭から最初の \0 までのバイト数(\0 自体は含まない)

strlen は、
配列の大きさではなく、文字列の長さ
を教えてくれます。

配列サイズと文字列長は別物

ここは、とても大事なポイントです。

観点意味
配列サイズ確保したメモリ領域の大きさ
文字列長\0 までに存在する文字数

strlen が返すのは、後者です。

この違いを意識できていれば、
文字列操作の事故は一気に減ります。

strcmp ― 文字列として等しいかを調べる

2つの文字列が等しいかを調べたいとき、
== 演算子を使ってはいけません。

== が比較するのは、
先頭アドレスが同じかどうか
だからです。

文字列の内容を比較したいときに使うのが、strcmp 関数です。

strcmp の書式

int strcmp(const char* str1, const char* str2);
  • 引数
    どちらも文字列の先頭アドレス
  • 戻り値
    文字列として等しければ 0

strcmp は、

  • 先頭から
  • 最初の \0 に出会うまで

文字を1つずつ比較します。

memcmp との違いを意識しよう

ここで、第10章で学んだ memcmp を思い出してください。

関数比較の基準
strcmp文字列文化(\0 まで)
memcmp純粋なメモリ内容

文字列として比較したいなら strcmp、
メモリ領域として比較したいなら memcmp。

この使い分けができると、
「なぜ結果が違うのか」で迷わなくなります。

標準関数は「安全装置」でもある

これらの文字列操作関数は、
単に便利なだけではありません。

  • \0 を前提に動作する。
  • 境界を意識した設計になっている。

という点で、
自分で処理を書くより安全な場面も多い
のです。

もちろん、
渡す文字列が壊れていれば安全ではありません。

だからこそ、

  • 文字列文化を守る。
  • 終端を壊さない。
  • 使用可能領域を超えない。

この3点が、
標準関数を使う前提条件になります。

次は「書き換える関数」へ

strlen や strcmp は、
文字列を「読む」ための関数です。

次は、

  • コピーする。
  • 連結する。

といった、
文字列を書き換える関数を見ていきましょう。

そこでは、
ここまで学んだ
「オーバーランを防ぐ感覚」
が、より重要になってきます。