きのうのプログラムをポインタを使って実装した
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を足すことで、自分が変換したい文字まで移動することが可能になります。