C言語における文字列操作:strlen()とsizeof()の違いを徹底解説
C言語における文字列の長さ取得:strlen() と sizeof() の違い
プログラミングにおいて、文字列とは複数の文字(character)が集まって構成されるデータのことです。C言語では、「この文字列には何文字使われているのか」という長さを調べる場面が頻繁にありますが、そのために用意されているのが strlen() と sizeof() の2つのアプローチです。
どちらも対象の「長さ」を知るために使用されますが、内部実装やNULL終端文字の扱いなどには重要な違いがあります。まずは、両者の基本的な相違点を表にまとめます。
strlen() と sizeof() の比較表
| No. | 項目 | strlen() | sizeof() |
|---|---|---|---|
| 1 | 定義 | string.h ヘッダーファイルに定義されている標準ライブラリ関数です。 | 関数ではなく、単項演算子の一種です。 |
| 2 | 実装方式 | 文字列を先頭から走査して文字数をカウントし、NULL終端文字('\0')を除いた長さを返します。 | 変数やデータ型が実際に確保しているメモリサイズをバイト単位で計算します(NULL文字も含みます)。 |
| 3 | NULL文字の扱い | NULL終端文字を除外し、文字列の長さの合計には含めません。 | 変数の中身(値)を問わず、割り当てられたメモリ全体のサイズを返します(NULL文字も含まれます)。 |
| 4 | 評価タイミング | プログラムの実行時(ランタイム)に文字列を走査して長さを求めます。 | コンパイル時にサイズが決定されます。 |
動作の違いを確認できるサンプルコード
#include <stdio.h>
#include <string.h>
int main(void) {
char str[100] = "Hello";
printf("strlen(str) = %zu\n", strlen(str)); // 出力: 5
printf("sizeof(str) = %zu\n", sizeof(str)); // 出力: 100
return 0;
}この例では、str は100バイト分のメモリを確保した配列ですが、実際に格納されているのは "Hello" とNULL文字の計6文字分だけです。strlen() は有効な文字数である「5」を返し、sizeof() は確保された配列全体のサイズである「100」を返します。
ポインタの場合の注意点
char *ptr = "Hello";
printf("%zu\n", strlen(ptr)); // 出力: 5
printf("%zu\n", sizeof(ptr)); // 出力: 8(64ビット環境の場合)sizeof() をポインタに対して適用すると、文字列の長さではなくポインタ自体のサイズ(64ビット環境では通常8バイト)が返されるため、注意が必要です。
使い分けのポイント
- 文字列の長さを知りたい場合 →
strlen()を使用する - 変数や型が占めるメモリサイズを知りたい場合 →
sizeof()を使用する sizeof()は配列の要素数を計算する際にも便利です:sizeof(arr) / sizeof(arr[0])
まとめ
strlen() と sizeof() は一見似た用途に見えますが、前者は「NULL終端文字を除いた文字数」を、後者は「NULL文字も含めた実際のメモリサイズ(バイト数)」を返します。また、strlen() は実行時に文字列を走査するため処理コストが発生する一方、sizeof() はコンパイル時に決まるためオーバーヘッドがありません。それぞれの特性を正しく理解し、目的に応じて使い分けることが、バグのない安全なCプログラムを書くうえで重要です。
-
OneNoteとOneNote for Windows 10の違いを徹底解説
Windows 10には、無料で利用できる「OneNote for Windows 10」というOneNoteアプリが標準搭載されています。このアプリを使えば、OneDrive(個人用・ビジネス用の両アカウント対応)との複数デバイス間同期、手書きノートの検索、コンテンツのメール送信など、さまざまな操作が可能です。 一方で、「OneNote デスクトップアプリ」(OneNote 2016)と呼ばれる別バージョンのOneNoteも存在します。同じ名前を持つアプリがなぜ2つあるのか、そして両者にはどのような違いがあるのか、詳しく見ていきましょう。 OneNoteとOneNote for Window
-
Pythonで奇数桁と偶数桁の合計の差を判定するプログラム
この記事では、与えられた問題を解決するための解法とアプローチについて詳しく解説します。 問題文 整数が1つ与えられたとき、奇数桁の合計と偶数桁の合計の差が0であるかどうかを判定する必要があります。 素朴なアプローチ(ブルートフォース) 最も単純な方法は、数値を構成するすべての偶数桁と奇数桁の合計をそれぞれ計算し、その差を求めることです。しかし、この方法では各桁を順番に処理するため、桁数に比例した計算時間が必要になります。 効率的なアプローチ:11の倍数判定を活用 計算時間を削減するために、「暗算の数学」でよく知られている性質を利用します。それは「ある整数の奇数桁の合計と偶数桁の合計の差が0にな