わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

"文字列"は10バイト

いきなりですが問題です.□に当てはまる数式を答えてください.

Cではsizeof演算子を用いることで,オブジェクトのサイズを求めることができる.以下で示すように,文字列リテラルオペランドにすることもできる.

#include <stdio.h>

int main(void)
{
  printf("%d\n", sizeof("文字列"));

  return 0;
}

ある環境で,上のプログラムを実行したところ,10を出力した.ここから,ソースファイルの文字コードUTF-8であると推測できる.もし日本語n文字からなる文字列リテラルであれば,そのサイズは□と表せる.

さっそくですが解答です.

  • 求めたいサイズをxとおくと,3:10=n:x.これを解いてx=\frac{10}{3}n

もちろん間違いです.日本語1文字だと3.33…バイトになります.サイズが分数・小数というのは,おかしいですね.
整数になってくれる場合でも,例えばn=6を代入するとx=20となりますが,これは実態に合いません.上記のソースコードで,"文字列"を"日本語文字列"に書き換えて,コンパイル・実行をしたら…出力は「19」となりました.
この問題を解くには,文字列はナル文字(ヌル文字,'\0')で終わるcharの配列であること,そしてそれは文字列リテラルにもあてはまることを,思い出す必要があります.
そうすると,"文字列"という,日本語3文字の文字列リテラルが10バイトとなるのは,日本語1文字を表現するのに3バイトを要し,そしてナル文字の1バイトを加えれば,3×3+1=10として表すことができます.
日本語がn文字の場合には,かける数の3をnに置き換えて,3×n+1とすればいいのです.「数式」を解答せよということなので,3n+1としましょう.

出典

今週月曜の授業で行った「おさらい問題」からです.実際には,文字列リテラルのほか,"文字列"を初期値とした配列変数や,"文字列"を指し示すポインタ変数についても,sizeofを適用したコードを提示し,それぞれの違いを問いました.
文字列リテラルに日本語を書いているのは,授業の教科書『C言語クイック入門&リファレンス (林 晴比古 実用マスターシリーズ)』でも,p.17に例があります.「文字列リテラルの値は,該当する文字コードの集合に終端を示す文字コード'\0'を付加したものです」とも記されています.
UTF-8では,ASCII文字は1文字1バイトというルール,そして日本語1文字を表現するのに3バイトという経験則は,おさらい問題をするより前の授業でも説明しています.常に3バイトではないことは,wikipedia:UTF-8,その中でも「デメリット」の項目を読んで理解しておきたいところです.