概要
C言語において文字列の扱いは極めて難しい。
今回はC言語の文字列についてステップバイステップで説明する。
対象者
とりあえずC言語の配列やポインタを一通り勉強したけれども、まだ全然よくわからない人。
プログラム
#include <stdio.h> #include <stdlib.h> int main(void) { // STEP 1 printf("-----STEP 1-----\n"); printf("Hello, World!\n"); printf("\n"); // STEP 2: use place holders 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!"); // STEP 3: use variables // 3.1: Initialize // Pointers char *ptr_str_init = "PTR INIT: Hello, World!!!"; // Arrays 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"); // 3.2: Declaration and Substitution // Pointers char *ptr_str_dec; ptr_str_dec = "PTR DEC: Hello, World!!!"; // Arrays 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'; // Mallocs 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"); // Pointers printf("Addr of \"PTR STO: Hello, World!!!!\" = %p\n", "PTR STO: Hello, World!!!!"); char *ptr_str_sto; ptr_str_sto = "PTR STO: Hello, World!!!!"; /* Notes: */ /* error: redefinition of 'ptr_str_sto' char *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); //copy 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'; //Error: Abort mlc_string2 = "hello"; printf("mlc_string1 = %s\n", mlc_string1); printf("mlc_string2 = %s\n", mlc_string2); //Error: Abort mlc_string1 = 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
(未完)