Last Update 2023/05/01
テスト概要
整数定数
整数定数が割り当てられる型階層の確認
浮動小数点定数
文字定数
文字列リテラル
その1
整数定数
sample1.c
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
printf("整数定数\n");
unsigned int samp_int1 = 123; /* 10進定数 */
unsigned int samp_int2 = 0x7b; /* 16進定数(0x + 小文字) */
unsigned int samp_int3 = 0x7B; /* 16進定数(0x + 大文字) */
unsigned int samp_int4 = 0X7b; /* 16進定数(0X + 小文字) */
unsigned int samp_int5 = 0X7B; /* 16進定数(0X + 大文字) */
unsigned int samp_int6 = 0173; /* 8進定数(プレフィックス : 0) */
printf("10進定数 %3d\n", samp_int1);
printf("16進定数 0x%2x --- %d\n", samp_int2, samp_int2);
printf("16進定数 0x%2X --- %d\n", samp_int3, samp_int3);
printf("16進定数 0X%2x --- %d\n", samp_int4, samp_int4);
printf("16進定数 0X%2X --- %d\n", samp_int5, samp_int5);
printf(" 8進定数 0%3o --- %d\n\n", samp_int6, samp_int6);
printf("明示的に定数の型を示すサフィックス\n");
printf("unsigned int u または U : %u(123u) %u(123U)\n", 123u, 123U);
printf("long l または L : %ld(123l) %ld(123L)\n", 123l, 123L);
printf("long long ll または LL : %lld(123ll) %lld(123LL)\n", 123ll, 123LL);
return EXIT_SUCCESS;
}
実行結果
$ gcc -Wall sample1.c
$ ./a.out
整数定数
10進定数 123
16進定数 0x7b --- 123
16進定数 0x7B --- 123
16進定数 0X7b --- 123
16進定数 0X7B --- 123
8進定数 0173 --- 123
明示的に定数の型を示すサフィックス
unsigned int u または U : 123(123u) 123(123U)
long l または L : 123(123l) 123(123L)
long long ll または LL : 123(123ll) 123(123LL)
その2
整数定数が割り当てられる型階層の確認
sample2.c
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
int main(void)
{
printf("整数定数が割り当てられる型階層の確認(以下、実装依存)\n\n");
printf("各種整数型最大値\n");
printf("INT_MAX=%d\n", INT_MAX);
printf("UINT_MAX=%u\n", UINT_MAX);
printf("LONG_MAX=%ld\n", LONG_MAX);
printf("ULONG_MAX=%lu\n", ULONG_MAX);
printf("LLONG_MAX=%lld\n", LLONG_MAX);
printf("ULLONG_MAX=%llu\n\n", ULLONG_MAX);
printf("実装環境において、long と long long の最大値が同一であるため、\n");
printf("サフィックスLL以外の long long の検証は省略\n\n");
printf("型違いの場合の警告確認用コード\n");
printf("long int (%%u) %u(2147483648)\n\n",
2147483648);
printf("10進定数・サフィックス無し\n");
printf("int (%%d) %d(2147483647)\n",
2147483647);
printf("long int (%%ld) %ld(2147483648)\n",
2147483648);
printf("long int (%%ld) %ld(9223372036854775807)\n\n",
9223372036854775807);
printf("16進定数・サフィックス無し\n");
printf("int (%%d) %d(0x7FFFFFFF)\n",
0x7FFFFFFF);
printf("unsigned int (%%u) %u(0x80000000)\n",
0x80000000);
printf("unsigned int (%%u) %u(0xFFFFFFFF)\n",
0xFFFFFFFF);
printf("long int (%%ld) %ld(0x100000000)\n",
0x100000000);
printf("long int (%%ld) %ld(0x7FFFFFFFFFFFFFFF)\n",
0x7FFFFFFFFFFFFFFF);
printf("unsigned long int (%%lu) %lu(0x8000000000000000)\n",
0x8000000000000000);
printf("unsigned long int (%%lu) %lu(0xFFFFFFFFFFFFFFFF)\n\n",
0xFFFFFFFFFFFFFFFF);
printf("8進定数・サフィックス無し\n");
printf("int (%%d) %d(017777777777)\n",
017777777777);
printf("unsigned int (%%u) %u(020000000000)\n",
020000000000);
printf("unsigned int (%%u) %u(037777777777)\n",
037777777777);
printf("long int (%%ld) %ld(040000000000)\n",
040000000000);
printf("long int (%%ld) %ld(0777777777777777777777)\n",
0777777777777777777777);
printf("unsigned long int (%%lu) %lu(01000000000000000000000)\n",
01000000000000000000000);
printf("unsigned long int (%%lu) %lu(01777777777777777777777)\n\n",
01777777777777777777777);
printf("10進定数・サフィックスU(u)\n");
printf("unsigned int (%%u) %u(4294967295U)\n",
4294967295U);
printf("unsigned long int (%%lu) %lu(4294967296U)\n",
4294967296U);
printf("unsigned long int (%%lu) %lu(18446744073709551615U)\n\n",
18446744073709551615U);
printf("16進定数・サフィックスU(u)\n");
printf("unsigned int (%%u) %u(0xFFFFFFFFU)\n",
0xFFFFFFFFU);
printf("unsigned long int (%%lu) %lu(0x100000000U)\n",
0x100000000U);
printf("unsigned long int (%%lu) %lu(0xFFFFFFFFFFFFFFFFU)\n\n",
0xFFFFFFFFFFFFFFFFU);
printf("8進定数・サフィックスU(u)\n");
printf("unsigned int (%%u) %u(037777777777U)\n",
037777777777U);
printf("unsigned long int (%%lu) %lu(040000000000U)\n",
040000000000U);
printf("unsigned long int (%%lu) %lu(01777777777777777777777U)\n\n",
01777777777777777777777U);
printf("10進定数・サフィックスL(l)\n");
printf("long int (%%ld) %ld(2147483647L)\n",
2147483647L);
printf("long int (%%ld) %ld(2147483648L)\n",
2147483648L);
printf("long int (%%ld) %ld(9223372036854775807L)\n\n",
9223372036854775807L);
printf("16進定数・サフィックスL(l)\n");
printf("long int (%%ld) %ld(0x7FFFFFFFL)\n",
0x7FFFFFFFL);
printf("long int (%%ld) %ld(0xFFFFFFFFL)\n",
0xFFFFFFFFL);
printf("long int (%%ld) %ld(0x7FFFFFFFFFFFFFFFL)\n",
0x7FFFFFFFFFFFFFFFL);
printf("unsigned long int (%%lu) %lu(0x8000000000000000L)\n",
0x8000000000000000L);
printf("unsigned long int (%%lu) %lu(0xFFFFFFFFFFFFFFFFL)\n\n",
0xFFFFFFFFFFFFFFFFL);
printf("8進定数・サフィックスL(l)\n");
printf("long int (%%ld) %ld(017777777777L)\n",
017777777777L);
printf("long int (%%ld) %ld(037777777777L)\n",
037777777777L);
printf("long int (%%ld) %ld(0777777777777777777777L)\n",
0777777777777777777777L);
printf("unsigned long int (%%lu) %lu(01000000000000000000000L)\n",
01000000000000000000000L);
printf("unsigned long int (%%lu) %lu(01777777777777777777777L)\n\n",
01777777777777777777777L);
printf("10進定数・サフィックスU(u)L(l)\n");
printf("unsigned long int (%%lu) %lu(4294967295UL)\n",
4294967295UL);
printf("unsigned long int (%%lu) %lu(18446744073709551615UL)\n\n",
18446744073709551615UL);
printf("16進定数・サフィックスU(u)L(l)\n");
printf("unsigned long int (%%lu) %lu(0xFFFFFFFFUL)\n",
0xFFFFFFFFUL);
printf("unsigned long int (%%lu) %lu(0xFFFFFFFFFFFFFFFFUL)\n\n",
0xFFFFFFFFFFFFFFFFUL);
printf("8進定数・サフィックスU(u)L(l)\n");
printf("unsigned long int (%%lu) %lu(037777777777UL)\n",
037777777777UL);
printf("unsigned long int (%%lu) %lu(01777777777777777777777UL)\n\n",
01777777777777777777777UL);
printf("10進定数・サフィックスLL(ll)\n");
printf("long long int (%%lld) %lld(2147483647LL)\n",
2147483647LL);
printf("long long int (%%lld) %lld(9223372036854775807LL)\n\n",
9223372036854775807LL);
printf("16進定数・サフィックスLL(ll)\n");
printf("long long int (%%lld) %lld(0x7FFFFFFFLL)\n",
0x7FFFFFFFLL);
printf("long long int (%%lld) %lld(0x7FFFFFFFFFFFFFFFLL)\n",
0x7FFFFFFFFFFFFFFFLL);
printf("unsigned long long int (%%llu) %llu(0x8000000000000000LL)\n",
0x8000000000000000LL);
printf("unsigned long long int (%%llu) %llu(0xFFFFFFFFFFFFFFFFLL)\n\n",
0xFFFFFFFFFFFFFFFFLL);
printf("8進定数・サフィックスLL(ll)\n");
printf("long long int (%%lld) %lld(017777777777LL)\n",
017777777777LL);
printf("long long int (%%lld) %lld(0777777777777777777777LL)\n",
0777777777777777777777LL);
printf("unsigned long long int (%%llu) %llu(01000000000000000000000LL)\n",
01000000000000000000000LL);
printf("unsigned long long int (%%llu) %llu(01777777777777777777777LL)\n\n",
01777777777777777777777LL);
printf("10進定数・サフィックスU(u)LL(ll)\n");
printf("unsigned long long int (%%llu) %llu(4294967295ULL)\n",
4294967295ULL);
printf("unsigned long long int (%%llu) %llu(18446744073709551615ULL)\n\n",
18446744073709551615ULL);
printf("16進定数・サフィックスU(u)LL(ll)\n");
printf("unsigned long long int (%%llu) %llu(0xFFFFFFFFULL)\n",
0xFFFFFFFFULL);
printf("unsigned long long int (%%llu) %llu(0xFFFFFFFFFFFFFFFFULL)\n\n",
0xFFFFFFFFFFFFFFFFULL);
printf("8進定数・サフィックスU(u)LL(ll)\n");
printf("unsigned long long int (%%llu) %llu(037777777777ULL)\n",
037777777777ULL);
printf("unsigned long long int (%%llu) %llu(01777777777777777777777ULL)\n\n",
01777777777777777777777ULL);
return EXIT_SUCCESS;
}
実行結果
$ gcc -Wall sample2.c
sample2.c: In function ‘main’: <--- printf関数において型違いの場合に出力される警告
sample2.c:21:33: warning: format ‘%u’ expects argument of type ‘unsigned int’, but argument 2 has type ‘long int’ [-Wformat=]
21 | printf("long int (%%u) %u(2147483648)\n\n",
| ~^
| |
| unsigned int
| %lu
22 | 2147483648);
| ~~~~~~~~~~
| |
| long int <--- 警告確認用コード以外の警告出力は無し
$ ./a.out
整数定数が割り当てられる型階層の確認(以下、実装依存)
各種整数型最大値
INT_MAX=2147483647
UINT_MAX=4294967295
LONG_MAX=9223372036854775807
ULONG_MAX=18446744073709551615
LLONG_MAX=9223372036854775807
ULLONG_MAX=18446744073709551615
実装環境において、long と long long の最大値が同一であるため、
サフィックスLL以外の long long の検証は省略
型違いの場合の警告確認用コード
long int (%u) 2147483648(2147483648)
10進定数・サフィックス無し
int (%d) 2147483647(2147483647)
long int (%ld) 2147483648(2147483648)
long int (%ld) 9223372036854775807(9223372036854775807)
16進定数・サフィックス無し
int (%d) 2147483647(0x7FFFFFFF)
unsigned int (%u) 2147483648(0x80000000)
unsigned int (%u) 4294967295(0xFFFFFFFF)
long int (%ld) 4294967296(0x100000000)
long int (%ld) 9223372036854775807(0x7FFFFFFFFFFFFFFF)
unsigned long int (%lu) 9223372036854775808(0x8000000000000000)
unsigned long int (%lu) 18446744073709551615(0xFFFFFFFFFFFFFFFF)
8進定数・サフィックス無し
int (%d) 2147483647(017777777777)
unsigned int (%u) 2147483648(020000000000)
unsigned int (%u) 4294967295(037777777777)
long int (%ld) 4294967296(040000000000)
long int (%ld) 9223372036854775807(0777777777777777777777)
unsigned long int (%lu) 9223372036854775808(01000000000000000000000)
unsigned long int (%lu) 18446744073709551615(01777777777777777777777)
10進定数・サフィックスU(u)
unsigned int (%u) 4294967295(4294967295U)
unsigned long int (%lu) 4294967296(4294967296U)
unsigned long int (%lu) 18446744073709551615(18446744073709551615U)
16進定数・サフィックスU(u)
unsigned int (%u) 4294967295(0xFFFFFFFFU)
unsigned long int (%lu) 4294967296(0x100000000U)
unsigned long int (%lu) 18446744073709551615(0xFFFFFFFFFFFFFFFFU)
8進定数・サフィックスU(u)
unsigned int (%u) 4294967295(037777777777U)
unsigned long int (%lu) 4294967296(040000000000U)
unsigned long int (%lu) 18446744073709551615(01777777777777777777777U)
10進定数・サフィックスL(l)
long int (%ld) 2147483647(2147483647L)
long int (%ld) 2147483648(2147483648L)
long int (%ld) 9223372036854775807(9223372036854775807L)
16進定数・サフィックスL(l)
long int (%ld) 2147483647(0x7FFFFFFFL)
long int (%ld) 4294967295(0xFFFFFFFFL)
long int (%ld) 9223372036854775807(0x7FFFFFFFFFFFFFFFL)
unsigned long int (%lu) 9223372036854775808(0x8000000000000000L)
unsigned long int (%lu) 18446744073709551615(0xFFFFFFFFFFFFFFFFL)
8進定数・サフィックスL(l)
long int (%ld) 2147483647(017777777777L)
long int (%ld) 4294967295(037777777777L)
long int (%ld) 9223372036854775807(0777777777777777777777L)
unsigned long int (%lu) 9223372036854775808(01000000000000000000000L)
unsigned long int (%lu) 18446744073709551615(01777777777777777777777L)
10進定数・サフィックスU(u)L(l)
unsigned long int (%lu) 4294967295(4294967295UL)
unsigned long int (%lu) 18446744073709551615(18446744073709551615UL)
16進定数・サフィックスU(u)L(l)
unsigned long int (%lu) 4294967295(0xFFFFFFFFUL)
unsigned long int (%lu) 18446744073709551615(0xFFFFFFFFFFFFFFFFUL)
8進定数・サフィックスU(u)L(l)
unsigned long int (%lu) 4294967295(037777777777UL)
unsigned long int (%lu) 18446744073709551615(01777777777777777777777UL)
10進定数・サフィックスLL(ll)
long long int (%lld) 2147483647(2147483647LL)
long long int (%lld) 9223372036854775807(9223372036854775807LL)
16進定数・サフィックスLL(ll)
long long int (%lld) 2147483647(0x7FFFFFFFLL)
long long int (%lld) 9223372036854775807(0x7FFFFFFFFFFFFFFFLL)
unsigned long long int (%llu) 9223372036854775808(0x8000000000000000LL)
unsigned long long int (%llu) 18446744073709551615(0xFFFFFFFFFFFFFFFFLL)
8進定数・サフィックスLL(ll)
long long int (%lld) 2147483647(017777777777LL)
long long int (%lld) 9223372036854775807(0777777777777777777777LL)
unsigned long long int (%llu) 9223372036854775808(01000000000000000000000LL)
unsigned long long int (%llu) 18446744073709551615(01777777777777777777777LL)
10進定数・サフィックスU(u)LL(ll)
unsigned long long int (%llu) 4294967295(4294967295ULL)
unsigned long long int (%llu) 18446744073709551615(18446744073709551615ULL)
16進定数・サフィックスU(u)LL(ll)
unsigned long long int (%llu) 4294967295(0xFFFFFFFFULL)
unsigned long long int (%llu) 18446744073709551615(0xFFFFFFFFFFFFFFFFULL)
8進定数・サフィックスU(u)LL(ll)
unsigned long long int (%llu) 4294967295(037777777777ULL)
unsigned long long int (%llu) 18446744073709551615(01777777777777777777777ULL)
その3
浮動小数点定数
sample.c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(void)
{
printf("浮動小数点定数\n\n");
double samp_d1 = 123.123; /* 10進浮動小数点定数 */
double samp_d2 = 123.; /* 10進浮動小数点定数(少数部無し) */
double samp_d3 = .123; /* 10進浮動小数点定数(整数部無し) */
double samp_d4 = 1.23e2; /* 10進浮動小数点定数(指数表記) */
double samp_d5 = 1.23E-2; /* 10進浮動小数点定数(指数表記) */
/* 16進浮動小数点定数 */
double samp_d6a = 0xA.8p0;
double samp_d6b = (10.0 + 8.0/16.0) * pow(2, 0);
double samp_d7a = 0xAF.CDp2;
double samp_d7b = (10.0 * 16.0 + 15.0 + 12.0/16 + 13.0/256.0) * pow(2, 2);
printf("10進浮動小数点定数 %e\n", samp_d1);
printf("10進浮動小数点定数(少数部無し) %e\n", samp_d2);
printf("10進浮動小数点定数(整数部無し) %e\n", samp_d3);
printf("10進浮動小数点定数(指数表記) %e\n", samp_d4);
printf("10進浮動小数点定数(指数表記) %E\n", samp_d5);
printf("16進浮動小数点定数 %E %E\n", samp_d6a, samp_d6b);
printf("16進浮動小数点定数 %E %E\n\n", samp_d7a, samp_d7b);
printf("明示的に定数の型を示すサフィックス\n");
printf("float\n");
printf(" f または F\n");
printf(" %1.10e(1.2345678901F) %1.10e(1.2345678901)\n",
1.2345678901F, 1.2345678901);
printf("long double\n");
printf(" l または L\n");
printf(" %1.17Le(1.23456789012345678L) %1.17e(1.23456789012345678)\n",
1.23456789012345678L, 1.23456789012345678);
return EXIT_SUCCESS;
}
実行結果
$ gcc -Wall sample.c
$ ./a.out
浮動小数点定数
10進浮動小数点定数 1.231230e+02
10進浮動小数点定数(少数部無し) 1.230000e+02
10進浮動小数点定数(整数部無し) 1.230000e-01
10進浮動小数点定数(指数表記) 1.230000e+02
10進浮動小数点定数(指数表記) 1.230000E-02
16進浮動小数点定数 1.050000E+01 1.050000E+01
16進浮動小数点定数 7.032031E+02 7.032031E+02
明示的に定数の型を示すサフィックス
float
f または F
1.2345678806e+00(1.2345678901F) 1.2345678901e+00(1.2345678901)
long double
l または L
1.23456789012345678e+00(1.23456789012345678L) 1.23456789012345669e+00(1.23456789012345678)
その4
文字定数
sample1.c
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
printf("文字定数\n\n");
printf("「%c」 --- 文字コード = %02X\n", 'A', 'A');
printf("「%c」 --- 文字コード = %02X\n", 'z', 'z');
printf("「%c」 --- 文字コード = %02X\n", '{', '{');
printf("\n");
printf("文字コードリスト\n");
for (int c1=0x2; c1<0x8; c1++)
{
printf("%02X ", c1*0x10);
for (int c2=0; c2<0x10; c2++)
{
printf("%c ", c1*0x10+c2);
}
printf("\n");
}
printf("\n");
return EXIT_SUCCESS;
}
実行結果
$ gcc -Wall sample1.c
$ ./a.out
文字定数
「A」 --- 文字コード = 41
「z」 --- 文字コード = 7A
「{」 --- 文字コード = 7B
文字コードリスト
20 ! " # $ % & ' ( ) * + , - . /
30 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
40 @ A B C D E F G H I J K L M N O
50 P Q R S T U V W X Y Z [ \ ] ^ _
60 ` a b c d e f g h i j k l m n o
70 p q r s t u v w x y z { | } ~
sample2.c
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <wchar.h>
#include <uchar.h>
/* バイト列表示用関数 */
void byteseq(char *cp, size_t nlen, const wchar_t *tname)
{
wprintf(L"%ls = ", tname);
for (int i=0; i<nlen; i++)
{
wprintf(L"%02X ", cp[i]);
}
wprintf(L"\n");
}
int main(void)
{
/* ロケール(LC_CTYPE)をシステムネイティブに設定 */
char *slocale = setlocale(LC_CTYPE, "");
wprintf(L"ロケール名 : %s\n\n", slocale);
/* 文字定数によるワイド文字型の初期化 */
wchar_t wct = L'\x3041';
char16_t c16t = u'\x3042';
char32_t c32t = U'\x3043';
/* 各ワイド文字型のサイズ */
wprintf(L"sizeof(wchar_t) = %d\n", sizeof(wchar_t));
wprintf(L"sizeof(char16_t) = %d\n", sizeof(char16_t));
wprintf(L"sizeof(char32_t) = %d\n", sizeof(char32_t));
/* 格納されているワイド文字の表示 */
wprintf(L"wchar_t : %lc\n", wct);
wprintf(L"char16_t : %lc\n", c16t);
wprintf(L"char32_t : %lc\n", c32t);
/* 格納されているワイド文字のバイト並び */
byteseq((char *)&wct, sizeof(wchar_t), L"wchar_t");
byteseq((char *)&c16t, sizeof(char16_t), L"char16_t");
byteseq((char *)&c32t, sizeof(char32_t), L"char32_t");
return EXIT_SUCCESS;
}
実行結果
$ gcc -Wall sample2.c
$ ./a.out
ロケール名 : en_GB.UTF-8
sizeof(wchar_t) = 4
sizeof(char16_t) = 2
sizeof(char32_t) = 4
wchar_t : ぁ
char16_t : あ
char32_t : ぃ
wchar_t = 41 30 00 00
char16_t = 42 30
char32_t = 43 30 00 00
sample3.c
エスケープシーケンス
エスケープシーケンス
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
/* エスケープシーケンス */
char c01 = '\''; /* 一重引用符 */
char c02 = '\"'; /* 二重引用符 */
char c03 = '\?'; /* 疑問符 */
char c04 = '\\'; /* バックスラッシュ */
char c05 = '\a'; /* アラート(ベル) */
char c06 = '\b'; /* 後退(バックスペース) */
char c07 = '\f'; /* 改ページ */
char c08 = '\n'; /* 改行 */
char c09 = '\r'; /* 復帰 */
char c10 = '\t'; /* 水平タブ */
char c11 = '\v'; /* 垂直タブ */
char c12 = '\101'; /* 8進整数文字定数 */
char c13 = '\x41'; /* 16進整数文字定数 */
printf("一重引用符 「%c」\n", c01);
printf("二重引用符 「%c」\n", c02);
printf("疑問符 「%c」\n", c03);
printf("バックスラッシュ 「%c」\n", c04);
printf("アラート >>> [Enterキー]");
getchar();
printf("%c\n", c05);
printf("後退(バックスペース) 「a%c」\n", c06);
printf("改ページ 「%c」\n", c07);
printf("改行 「%c」\n", c08);
printf("復帰 「%c」\n", c09);
printf("水平タブ(2連) 「%c%c」\n", c10, c10);
printf("垂直タブ(2連) 「%c%c」\n", c11, c11);
printf("8進整数文字定数 「%c」\n", c12);
printf("16進整数文字定数 「%c」\n", c13);
return EXIT_SUCCESS;
}
実行結果
$ gcc -Wall sample3.c
$ ./a.out
一重引用符 「'」
二重引用符 「"」
疑問符 「?」
バックスラッシュ 「\」
アラート >>> [Enterキー] <--- Enterキー押し下げでベル(画面フラッシュ)発生
後退(バックスペース) 「」 <--- 1文字手前の「a」を削除
改ページ 「
」
改行 「
」
」帰 「 <--- 出力位置が行頭に移動
水平タブ(2連) 「 」
垂直タブ(2連) 「
」
8進整数文字定数 「A」
16進整数文字定数 「A」
sample4.c
エスケープシーケンス(ユニバーサル文字)
エスケープシーケンス(ユニバーサル文字)
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <wchar.h>
int main(void)
{
/* ロケール(LC_CTYPE)をシステムネイティブに設定 */
setlocale(LC_CTYPE, "");
/* エスケープシーケンス */
/* ユニバーサル文字名 */
wchar_t wct = L'\u3042';
wprintf(L"wchar_t : %lc\n", wct);
return EXIT_SUCCESS;
}
実行結果
$ gcc -Wall sample4.c
$ ./a.out
wchar_t : あ
その5
文字列リテラル
sample1.c
UTF-8で符号化されたマルチバイト文字を含む場合
UTF-8で符号化されたマルチバイト文字を含む場合
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* バイト列表示用関数 */
void byteseq(const char *cp, size_t nlen, const char *tname)
{
printf("%s = ", tname);
for (int i=0; i<nlen; i++)
{
printf("%02X ", (unsigned char)cp[i]);
}
printf("\n");
}
int main(void)
{
printf("文字列リテラル\n");
/* 文字列リテラル */
const char samp1[] = "あいうえお\n";
/* 文字列リテラル(接頭辞u8 : UTF-8) */
const char samp2[] = u8"あいうえお\n";
printf("samp1 = %s", samp1);
printf("samp2 = %s", samp2);
byteseq(samp1, strlen(samp1), "接頭辞無し");
byteseq(samp2, strlen(samp2), "接頭辞(u8)");
return EXIT_SUCCESS;
}
実行結果
$ gcc -Wall sample1.c
$ ./a.out
文字列リテラル
samp1 = あいうえお
samp2 = あいうえお
接頭辞無し = E3 81 82 E3 81 84 E3 81 86 E3 81 88 E3 81 8A 0A
接頭辞(u8) = E3 81 82 E3 81 84 E3 81 86 E3 81 88 E3 81 8A 0A
sample2.c
ワイド文字列リテラルを含む場合
ワイド文字列リテラルを含む場合
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <wchar.h>
#include <uchar.h>
/* バイト列表示用関数 */
void byteseq(char *cp, size_t nlen, const wchar_t *tname)
{
wprintf(L"%ls = ", tname);
for (int i=0; i<nlen; i++)
{
wprintf(L"%02X ", cp[i]);
}
wprintf(L"\n");
}
int main(void)
{
/* ロケール(LC_CTYPE)をシステムネイティブに設定 */
char *slocale = setlocale(LC_CTYPE, "");
wprintf(L"ロケール名 : %s\n\n", slocale);
/* 文字列リテラル(wchar_t) */
const wchar_t samp_wct[] = L"あいうえお";
/* 文字列リテラル(char16_t・終端用\0付加) */
const char16_t samp_c16t[] = u"あいうえお\0\0\0";
/* 文字列リテラル(char32_t) */
const char32_t samp_c32t[] = U"あいうえお";
/* 関数wprintfによるwchar_t型文字列リテラルの出力 */
wprintf(L"wchar_t samp_wct = %ls\n", samp_wct);
/* 関数wprintfによるchar16_t型文字列リテラルの出力 */
wprintf(L"char16_t(文字列定数) samp_c16t = %ls\n", samp_c16t);
/* 関数wprintfによるchar16_t型文字定数の個別出力 */
wprintf(L"char16_t(文字定数個別) samp_c16t = %lc%lc%lc%lc%lc\n",
samp_c16t[0], samp_c16t[1], samp_c16t[2],
samp_c16t[3], samp_c16t[4]);
/* 関数wprintfによるchar32_t型文字列リテラルの出力 */
wprintf(L"char32_t samp_c32t = %ls\n\n", samp_c32t);
byteseq((char *)samp_wct, 5 * sizeof(wchar_t), L"wchar_t");
byteseq((char *)samp_c16t, 5 * sizeof(char16_t), L"char16_t");
byteseq((char *)samp_c32t, 5 * sizeof(char32_t), L"char32_t");
return EXIT_SUCCESS;
}
実行結果
$ gcc -Wall sample2.c
$ ./a.out
ロケール名 : en_GB.UTF-8
wchar_t samp_wct = あいうえお
char16_t(文字列定数) samp_c16t = ????????????お <--- 文字化け発生
char16_t(文字定数個別) samp_c16t = あいうえお
char32_t samp_c32t = あいうえお
wchar_t = 42 30 00 00 44 30 00 00 46 30 00 00 48 30 00 00 4A 30 00 00
char16_t = 42 30 44 30 46 30 48 30 4A 30 <--- char16_t型は2バイト単位
char32_t = 42 30 00 00 44 30 00 00 46 30 00 00 48 30 00 00 4A 30 00 00
sample3.c
文字列リテラルの連結
文字列リテラルの連結
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <wchar.h>
/* バイト列表示用関数 */
void byteseq(char *cp, size_t nlen, const wchar_t *tname)
{
wprintf(L"%ls = ", tname);
for (int i=0; i<nlen; i++)
{
wprintf(L"%02X ", cp[i]);
}
wprintf(L"\n");
}
int main(void)
{
setlocale(LC_CTYPE, "");
/* シングルバイト文字列 */
const char samp1[] = "ab";
/* シングルバイト文字列 シングルバイト文字列 */
const char samp2[] = "ab" "cd";
/* ワイド文字列 */
const wchar_t samp3[] = L"ab";
/* シングルバイト文字 ワイド文字列 */
const wchar_t samp4[] = "ab" L"cd";
/* ワイド文字列 ワイド文字列 */
const wchar_t samp5[] = L"ab" L"cd";
/* シングルバイト文字 シングルバイト文字 シングルバイト文字 */
const char samp6[] = "ab" "cd" "ef";
/* ワイド文字列 シングルバイト文字 ワイド文字列 */
const wchar_t samp7[] = L"ab" "cd" L"ef";
wprintf(L"samp1 = %s\n", samp1);
wprintf(L"samp2 = %s\n", samp2);
wprintf(L"samp3 = %ls\n", samp3);
wprintf(L"samp4 = %ls\n", samp4);
wprintf(L"samp5 = %ls\n", samp5);
wprintf(L"samp6 = %s\n", samp6);
wprintf(L"samp7 = %ls\n", samp7);
wprintf(L"\n");
byteseq((char *)samp1, 2 * sizeof(char), L"samp1");
byteseq((char *)samp2, 4 * sizeof(char), L"samp2");
byteseq((char *)samp3, 2 * sizeof(wchar_t), L"samp3");
byteseq((char *)samp4, 4 * sizeof(wchar_t), L"samp4");
byteseq((char *)samp5, 4 * sizeof(wchar_t), L"samp5");
byteseq((char *)samp6, 6 * sizeof(char), L"samp6");
byteseq((char *)samp7, 6 * sizeof(wchar_t), L"samp7");
return EXIT_SUCCESS;
}
実行結果
$ gcc -Wall sample3.c
$ ./a.out
samp1 = ab
samp2 = abcd
samp3 = ab
samp4 = abcd
samp5 = abcd
samp6 = abcdef
samp7 = abcdef
samp1 = 61 62
samp2 = 61 62 63 64
samp3 = 61 00 00 00 62 00 00 00
samp4 = 61 00 00 00 62 00 00 00 63 00 00 00 64 00 00 00
samp5 = 61 00 00 00 62 00 00 00 63 00 00 00 64 00 00 00
samp6 = 61 62 63 64 65 66
samp7 = 61 00 00 00 62 00 00 00 63 00 00 00 64 00 00 00 65 00 00 00 66 00 00 00
実行環境
GNU bash, version 5.1.16
GCC-12.2.0
GNU C Library 2.36
GNU Binutils 2.39
GCC-12.2.0
GNU C Library 2.36
GNU Binutils 2.39
コード例・出力内容中の表記
・実行例中の太字表記部分は、コマンドなどの入力された文字列を示します。
・「︙」や「...」の着色省略表記は、 実際のソースコードや出力内容などを省略加工した部分を示します。
・「︙」や「...」の着色省略表記は、 実際のソースコードや出力内容などを省略加工した部分を示します。