
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 は、
文字列を「読む」ための関数です。
次は、
- コピーする。
- 連結する。
といった、
文字列を書き換える関数を見ていきましょう。
そこでは、
ここまで学んだ
「オーバーランを防ぐ感覚」
が、より重要になってきます。
