auの日記

プログラミング初心者の日記。(auはハンドルネームです)

きのうのプログラムをポインタを使って実装した

auです。
今回はきのうのプログラムをポインタを使用して実装しました。

#include <stdio.h>

int main(void) {
    int slide = 0;
    int over = 0;
    char word[128];
    char n_word[128];
    char all_word[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    char *p_word;
    char *p_n_word;
    char *p_all_word;

    printf("半角アルファベット: ");
    scanf("%[^\n]", word);

    printf("ずらす文字数: ");
    scanf("%d", &slide);

    p_word = word;
    p_n_word = n_word;
    p_all_word = all_word;

    for (int i = 0; *(p_word + i) != NULL; i++) {
        *(p_n_word + i) = *(p_word + i);
        for (int j = 0; j < 52; j++) {
            if (*(p_n_word + i) == *(p_all_word + j)) {
                over = j + slide;
                if (over >= 52) {
                    over -= 52;
                }
                *(p_n_word + i) = *(p_all_word + over);
                break;
            }
        }
    }

    printf("%s\n", n_word);

    return 0;
}

// 実行結果
半角アルファベット: I am au.
ずらす文字数: 2
K co cw.

このプログラムは、ポインタ配列を使って実装しています。
char型を10バイト分宣言した場合、どのようにメモリに配置されているのか確認してみます。

#include <stdio.h>

int main(void) {
    char ch[10] = "abcdefghij";
    char *p_ch;
    p_ch = ch;
    for (int i = 0; i < 10; i++) {
        printf("メモリの場所: %p\n", *(p_ch + i));
        printf("%c\n", *(p_ch + i));
    }
    return 0;
}

// 実行結果
メモリの場所: 0x61
a
メモリの場所: 0x62
b
メモリの場所: 0x63
c
メモリの場所: 0x64
d
メモリの場所: 0x65
e
メモリの場所: 0x66
f
メモリの場所: 0x67
g
メモリの場所: 0x68
h
メモリの場所: 0x69
i
メモリの場所: 0x6a
j

この結果を見てわかる通り、配列で宣言されたchar型は1バイトずつ並んで存在しています。
そのため、1ずつ増加していく変数iを足すことで、自分が変換したい文字まで移動することが可能になります。