[c言語] さっと復習(5) 配列

配列

一つの名前で複数のデータを管理するために使う。

配列

#include <stdio.h>

int main(void) {
    int array_i[4];
    int sum;
    int i;

    array_i[0] = 1;
    array_i[1] = 2;
    array_i[2] = 3;
    array_i[3] = 4;
    
    sum = 0;

    for (i=0; i < 4; i++) {
        printf("%d ", array_i[i]);
        sum += array_i[i];
    }

    printf("\n");
    printf("The total is %d\n", sum);
}

まとめて初期化する。

#include <stdio.h>

int main(void) {
    int array_i[] = {1, 2, 3, 4};
    int sum;
    int i;
    
    sum = 0;

    for (i=0; i < 4; i++) {
        printf("%d ", array_i[i]);
        sum += array_i[i];
    }

    printf("\n");
    printf("The total is %d\n", sum);
}

多重配列

n次元の配列を作ることができる。

#include <stdio.h>

int main(void) {
    int a[3][4];
    int i, j;

    for (i=0; i<3; i++){
        for (j=0; j<4; j++){
            a[i][j] = i + j;
        }
    }

    for (i=0; i<3; i++) {
        for (j=0; j<4; j++) {
            printf("%d " , a[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}

文字列と配列

c には文字列を扱うための型が存在しないので、char 型の配列を使うことで文字列とする。

#include <stdio.h>

int main(void) {
    char s[5] = {'a', 'b', 'c', 'd', '\0'};
    int i;
    
    printf("%s\n", s);

    // それぞれの文字は対応する整数として保存される。
    printf("%d\n", s[0]);
    // cast すれば文字になる。
    printf("%c\n", (char) s[0]);
    
    for (i=0; i<5; i++) {
        printf("%c", (char) s[i]);
    }
    printf("\n");
}

文字列の終わりを表すため、終端文字(Null文字) \0 を配列の最後に入れる。

プログラムは終端文字を見つけるまでメモリをたどる。

#include <stdio.h>

int main(void) {
    char s1[5] = {'a', 'b', 'c', 'd', '\0'};
    char s2[4] = {'a', 'b', 'c', 'd'};
    char s3[5] = {'a', 'b', 'c', 'd', '\0'};

    printf("%s\n", s1);
    printf("%s\n", s2);
    printf("%s\n", s3);
}

abcd
abcdabcd
abcd

文字列をまとめて代入できる。

この場合終端文字は最後に自動的に挿入され、確保される配列のサイズは 文字数+1になる。

#include <stdio.h>

int main(void) {
    char s[] = "abcd";
    int i;
    
    printf("%s\n", s);
    
    for (i=0; i<5; i++) {
        printf("%c", (char) s[i]);
    }
    printf("\n");
}

宣言で確保した配列の容量に注意する。

容量を超える文字列は入力しようとすると、gcc では stack smashing detected が発生し、強制終了する。

#include <stdio.h>

int main(void) {
    char s[10];

    // 10バイトの配列を確保した。
    // 10バイトを超える文字を入力すると stack smashing detected が発生。
    // 強制終了する。
    printf("Input string...: ");
    scanf("%s", s);
    printf("%s\n", s);

}

scanf関数で、文字列(%s)のときに”&”が不要である理由