Cの文字列はchar配列+ヌル終端という約束事。string.hの道具と安全な扱い方、文字コードの基礎まで。
多くのプログラミング言語には「文字列型」という専用の型があります。Cにはありません。Cの文字列は char の配列、それだけです。この一文が、このトラック全体の土台になります。 まず1文字。char は文字1個を入れる型で、シングルクォートで書きます。 文字が複数並んだものが文字列です。だから char の配列を使います。 "hello" は5文字なのに、な…
char s[6] = "hello"; で6個ぶん必要だった理由を明かします。文字列の最後には、必ずヌル文字 '\0' が置かれるからです。 '\0' は値が0の文字です。数字の '0'(値48)とは別物なので、混同しないでください。画面には何も表示されず、ただ「ここで終わり」を意味します。 なぜ印が必要なのか 配列を渡されただけでは、どこまでが文字列なの…
ソースコードにダブルクォートで書いた "hello" を文字列リテラルと呼びます。文字列の初期化には、いくつかの書き方があります。 b の書き方が便利です。文字数を数えなくても、コンパイラが '\0' のぶんを含めて大きさを決めてくれます。文字列を後から書き換える予定がないなら、これが最も安全です。 c のように大きく取るのは、あとで長い文字列を入れ直す予定…
文字列の操作は、#include <string.h> で使える標準関数が引き受けてくれます。まずは4つ、これだけ覚えれば大半の場面をしのげます。 | 関数 | 役割 | |---|---| | strlen | 文字数を数える('\0' は含まない) | | strcpy | 文字列をコピーする | | strcat | 文字列を後ろに連結する | | s…
文字列を扱う配列のことを、バッファ(buffer)と呼びます。そしてCの歴史上、最も多くの被害を出してきたバグが、このバッファから溢れる事故です。 コンパイルは通ります。実行すると、strcpy は行き先の大きさを知らないまま10バイトを書き込み、配列の外へはみ出します。隣の変数が壊れる、関数の戻り先が壊れる、あるいは何事もなく動いてしまう——境界外アクセス…
「この文字は数字か」「アルファベットか」「大文字に変えたい」——こうした1文字ごとの処理をまとめた道具箱が ctype.h です。 | 関数 | 調べること | |---|---| | isdigit | 数字('0'〜'9')か | | isalpha | アルファベットか | | isspace | 空白・タブ・改行か | | isupper / isl…
コンピュータは数値しか扱えません。ではなぜ文字を表示できるのか。答えは単純で、文字にも番号が振ってあるからです。「A は65番」という対応表があり、その代表が ASCII です。 同じ変数を %c で見れば文字、%d で見れば数値。char は「1バイトの小さな整数型」であり、文字はその値の解釈にすぎません。 覚えておくと得をする番号 | 文字 | 値 | …
文字列処理も、配列と同じで「型」で覚えます。土台になるのは、このfor文です。 条件が i < n ではなく s[i] != '\0' になっているのがポイントです。長さを知らなくても、終わりの印に出会うまで進めばよい。これがCの文字列の走査の基本形です。 配列のときは i < n と要素数で止めました。文字列で要素数がなくても止まれるのは、終わりの印(ヌル…
もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。