疑念は探究の動機であり、探究の唯一の目的は信念の確定である。

数学・論理学・哲学・語学のことを書きたいと思います。どんなことでも何かコメントいただけるとうれしいです。特に、勉学のことで間違いなどあったらご指摘いただけると幸いです。 よろしくお願いします。くりぃむのラジオを聴くこととパワポケ2と日向坂46が人生の唯一の楽しみです。

C言語の文字列について: 完全攻略ガイド

概要
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


(未完)