C 言語での文字列配列のクリア
胡金庫
2023年10月12日
この記事では、C 言語で文字列配列をクリアする方法をいくつか説明します。
関数 memset
を使って C 言語で文字列配列をクリアする
メモリ領域を定数値で設定するには、一般に memset
関数を使用します。この関数は標準ライブラリの一部であり、<string.h>
ヘッダファイルで定義されています。
memset
は 3つの引数を取ります。第 1 引数はメモリ領域へのポインタ void
であり、第 2 引数は定数バイト値であり、最後の引数は指定したメモリアドレスで満たすバイト数を示します。char
配列をクリアするために 0
整数値を渡すことができることに注意してください。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void printCharArray(char *arr, size_t len) {
printf("arr: ");
for (size_t i = 0; i < len; ++i) {
printf("%c, ", arr[i]);
}
printf("\n");
}
#define LENGTH 20
int main() {
char c_arr[LENGTH] = {'a', 'b', 'c', 'd', 'e', 'f', 'g'};
printCharArray(c_arr, LENGTH);
memset(c_arr, 0, LENGTH);
printCharArray(c_arr, LENGTH);
exit(EXIT_SUCCESS);
}
出力:
arr: a, b, c, d, e, f, g, , , , , , , , , , , , , ,
arr: , , , , , , , , , , , , , , , , , , , ,
あるいは、memset
は特定の文字を定数バイト引数に指定して呼び出すこともできます。この場合、配列を埋める文字として任意にゼロを選び、結果としてメモリ領域がクリアされます。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void printCharArray(char *arr, size_t len) {
printf("arr: ");
for (size_t i = 0; i < len; ++i) {
printf("%c, ", arr[i]);
}
printf("\n");
}
#define LENGTH 20
int main() {
char c_arr2[LENGTH] = "techarmp array";
printCharArray(c_arr2, LENGTH);
memset(c_arr2, '0', LENGTH);
printCharArray(c_arr2, LENGTH);
exit(EXIT_SUCCESS);
}
出力:
arr: t, e, m, p, , a, r, r, a, y, , , , , , , , , , ,
arr: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
関数 bzero
または explicit_bzero
を用いて C 言語の文字配列をクリアする
bzero
は、メモリ領域をゼロの \0
バイトで埋めるための別の標準ライブラリ関数です。引数はメモリ領域へのポインタと上書きするバイト数の 2つだけです。一方、explicit_bzero
は、コンパイラの最適化に関係なく書き込み操作を保証する代替関数です。ユーザの指示があれば、コンパイラはコードを解析して冗長な命令を削除しますが、explicit_bzero
関数はこの特定のシナリオのために設計されています。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void printCharArray(char *arr, size_t len) {
printf("arr: ");
for (size_t i = 0; i < len; ++i) {
printf("%c, ", arr[i]);
}
printf("\n");
}
#define LENGTH 20
int main() {
char c_arr[LENGTH] = {'a', 'b', 'c', 'd', 'e', 'f', 'g'};
printCharArray(c_arr, LENGTH);
bzero(c_arr, LENGTH);
printCharArray(c_arr, LENGTH);
explicit_bzero(c_arr, LENGTH);
printCharArray(c_arr, LENGTH);
exit(EXIT_SUCCESS);
}
著者: 胡金庫