概要
C言語において文字列の扱いは極めて難しい。
今回はC言語の文字列についてステップバイステップで説明する。
対象者
とりあえずC言語の配列やポインタを一通り勉強したけれども、まだ全然よくわからない人。
プログラム
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
printf("-----STEP 1-----\n");
printf("Hello, World!\n");
printf("\n");
printf("-----STEP 2-----\n");
printf("%s\n", "Hello, World!!");
printf("Addr of \"Hello, World!!\" = %p\n", "Hello, World!!");
printf("Addr of &\"Hello, World!!\" = %p\n", &"Hello, World!!");
printf("\"Hello, World!!\"[0] = %c\n", "Hello, World!!"[0]);
printf("\"Hello, World!!\"[1] = %c\n", "Hello, World!!"[1]);
printf("\"Hello, World!!\"[2] = %c\n", "Hello, World!!"[2]);
printf("\"Hello, World!!\"[3] = %c\n", "Hello, World!!"[3]);
printf("\"Hello, World!!\"[4] = %c\n", "Hello, World!!"[4]);
printf("\"Hello, World!!\"[5] = %c\n", "Hello, World!!"[5]);
printf("\"Hello, World!!\"[6] = %c\n", "Hello, World!!"[6]);
printf("\"Hello, World!!\"[7] = %c\n", "Hello, World!!"[7]);
printf("\"Hello, World!!\"[8] = %c\n", "Hello, World!!"[8]);
printf("\"Hello, World!!\"[9] = %c\n", "Hello, World!!"[9]);
printf("\"Hello, World!!\"[10] = %c\n", "Hello, World!!"[10]);
printf("\"Hello, World!!\"[11] = %c\n", "Hello, World!!"[11]);
printf("\"Hello, World!!\"[12] = %c\n", "Hello, World!!"[12]);
printf("\"Hello, World!!\"[13] = %c\n", "Hello, World!!"[13]);
printf("\"Hello, World!!\"[14] = %c\n", "Hello, World!!"[14]);
printf("\n");
printf("\\x020 = %c\n", '\x020');
printf("\\0 = %c\n", '\0');
printf("Hello,\\x020World! = %s\n", "Hello,\x020World!");
char *ptr_str_init = "PTR INIT: Hello, World!!!";
char arr_str_init[] = "ARR INIT: Hello, World!!!";
printf("-----STEP 3.1-----\n");
printf("%s\n", arr_str_init);
printf("%s\n", ptr_str_init);
printf("\n");
char *ptr_str_dec;
ptr_str_dec = "PTR DEC: Hello, World!!!";
char arr_str_dec[30];
arr_str_dec[0] = 'A';
arr_str_dec[1] = 'R';
arr_str_dec[2] = 'R';
arr_str_dec[3] = ' ';
arr_str_dec[4] = 'D';
arr_str_dec[5] = 'E';
arr_str_dec[6] = 'C';
arr_str_dec[7] = ':';
arr_str_dec[8] = ' ';
arr_str_dec[9] = 'H';
arr_str_dec[10] = 'e';
arr_str_dec[11] = 'l';
arr_str_dec[12] = 'l';
arr_str_dec[13] = 'o';
arr_str_dec[14] = ',';
arr_str_dec[15] = ' ';
arr_str_dec[16] = 'W';
arr_str_dec[17] = 'o';
arr_str_dec[18] = 'r';
arr_str_dec[19] = 'l';
arr_str_dec[20] = 'd';
arr_str_dec[21] = '!';
arr_str_dec[22] = '!';
arr_str_dec[23] = '!';
arr_str_dec[24] = '\0';
char *mlc_str_dec;
mlc_str_dec = malloc(30);
mlc_str_dec[0] = 'M';
mlc_str_dec[1] = 'L';
mlc_str_dec[2] = 'C';
mlc_str_dec[3] = ' ';
mlc_str_dec[4] = 'D';
mlc_str_dec[5] = 'E';
mlc_str_dec[6] = 'C';
mlc_str_dec[7] = ':';
mlc_str_dec[8] = ' ';
mlc_str_dec[9] = 'H';
mlc_str_dec[10] = 'e';
mlc_str_dec[11] = 'l';
mlc_str_dec[12] = 'l';
mlc_str_dec[13] = 'o';
mlc_str_dec[14] = ',';
mlc_str_dec[15] = ' ';
mlc_str_dec[16] = 'W';
mlc_str_dec[17] = 'o';
mlc_str_dec[18] = 'r';
mlc_str_dec[19] = 'l';
mlc_str_dec[20] = 'd';
mlc_str_dec[21] = '!';
mlc_str_dec[22] = '!';
mlc_str_dec[23] = '!';
mlc_str_dec[24] = '\0';
printf("-----STEP 3.2-----\n");
printf("%s\n", ptr_str_dec);
printf("%s\n", arr_str_dec);
printf("%s\n", mlc_str_dec);
printf("\n");
free(mlc_str_dec);
printf("-----STEP 4-----\n");
printf("Addr of \"PTR STO: Hello, World!!!!\" = %p\n", "PTR STO: Hello, World!!!!");
char *ptr_str_sto;
ptr_str_sto = "PTR STO: Hello, World!!!!";
printf("Addr of ptr_str_sto = %p\n", ptr_str_sto);
printf("%s\n", ptr_str_sto);
printf("Addr of \"ptr sto: hello, world!!!!\" = %p\n", "ptr sto: hello, world!!!!");
ptr_str_sto = "ptr sto: hello, world!!!!";
printf("Addr of ptr_str_sto = %p\n", ptr_str_sto);
printf("%s\n", ptr_str_sto);
char arr_str_sto[30] = {'A', 'R', 'R', ' ', 'S', 'T', 'O', ':', ' ', 'H', 'e', 'l', 'l', 'o', ',', ' ', 'W', 'o', 'r', 'l', 'd', '!', '!', '!', '!', '\0'};
printf("Addr of arr_str_sto = %p\n", arr_str_sto);
printf("%s\n", arr_str_sto);
printf("\n");
arr_str_sto[0] = 'a';
arr_str_sto[1] = 'r';
arr_str_sto[2] = 'r';
arr_str_sto[4] = 's';
arr_str_sto[5] = 't';
arr_str_sto[6] = 'o';
arr_str_sto[9] = 'h';
arr_str_sto[16] = 'w';
printf("Addr of arr_str_sto = %p\n", arr_str_sto);
printf("%s\n", arr_str_sto);
int i = 1;
int j = 2;
printf("Addr of int i = %p\n", &i);
printf("int i = %d\n", i);
i = j;
printf("Addr of int i = %p\n", &i);
printf("int i = %d\n", i);
char *mlc_string1 = malloc(10);
char *mlc_string2 = malloc(10);
mlc_string1[0] = 'H';
mlc_string1[1] = 'e';
mlc_string1[2] = 'l';
mlc_string1[3] = 'l';
mlc_string1[4] = 'o';
mlc_string2[0] = 'h';
mlc_string2[1] = 'e';
mlc_string2[2] = 'l';
mlc_string2[3] = 'l';
mlc_string2[4] = 'o';
printf("mlc_string1 = %s\n", mlc_string1);
printf("mlc_string2 = %s\n", mlc_string2);
printf("mlc_string1 = %s\n", mlc_string1);
free(mlc_string1);
free(mlc_string2);
return 0;
}
実行結果
-----STEP 1-----
Hello, World!
-----STEP 2-----
Hello, World!!
Addr of "Hello, World!!" = 0x103f71b99
Addr of &"Hello, World!!" = 0x103f71b99
"Hello, World!!"[0] = H
"Hello, World!!"[1] = e
"Hello, World!!"[2] = l
"Hello, World!!"[3] = l
"Hello, World!!"[4] = o
"Hello, World!!"[5] = ,
"Hello, World!!"[6] =
"Hello, World!!"[7] = W
"Hello, World!!"[8] = o
"Hello, World!!"[9] = r
"Hello, World!!"[10] = l
"Hello, World!!"[11] = d
"Hello, World!!"[12] = !
"Hello, World!!"[13] = !
"Hello, World!!"[14] =
\x020 =
\0 =
Hello,\x020World! = Hello, World!
-----STEP 3.1-----
ARR INIT: Hello, World!!!
PTR INIT: Hello, World!!!
-----STEP 3.2-----
PTR DEC: Hello, World!!!
ARR DEC: Hello, World!!!
MLC DEC: Hello, World!!!
-----STEP 4-----
Addr of "PTR STO: Hello, World!!!!" = 0x103f71e77
Addr of ptr_str_sto = 0x103f71e77
PTR STO: Hello, World!!!!
Addr of "ptr sto: hello, world!!!!" = 0x103f71edb
Addr of ptr_str_sto = 0x103f71edb
ptr sto: hello, world!!!!
Addr of arr_str_sto = 0x7ffeebc8f860
ARR STO: Hello, World!!!!
Addr of arr_str_sto = 0x7ffeebc8f860
arr sto: hello, world!!!!
Addr of int i = 0x7ffeebc8f834
int i = 1
Addr of int i = 0x7ffeebc8f834
int i = 2
mlc_string1 = Hello
mlc_string2 = hello
mlc_string1 = Hello
(未完)