C言語で文字列を扱う場合、バッファオーバーフローに気をつけながら扱う必要があります。
そのためには、文字列の終端がどこか、そもそも文字列が空文字列かどうか判定するための処理を用意しなければなりません。
C言語では、そういった文字列が空かどうか、文字列の終端がどこかを調べる際にNULL文字で判定します。
今回は空文字列かどうかをNULLを使って判定する方法を解説します。
目次から探す
NULLを使って空文字列か判定する
原理さえ分かれば実はとても簡単です。
C言語で扱う文字列の最後には必ずNULLが格納されるようになっており、文字列の先頭がNULLだった場合は空文字列という判定ができるのです。
そのため、文字列が空かどうかを調べるには、先頭の一文字がNULLかどうか判定するだけで調べられます。
#include<stdio.h>
int main() {
char str1[] = "";
char str2[] ="Hello";
if (str1[0] == NULL) {
printf("文字列は空です\n");
}
else {
printf("文字列は空ではありません\n");
}
if (str2[0] == NULL) {
printf("文字列は空です\n");
}
else {
printf("文字列は空ではありません\n");
}
return 0;
}
要素数0でもエラーにならないのか?
サンプルコードのstr1の値は””なので、要素数0で何も入っていないようにみえるかもしれません。
ですが、配列として宣言かつ空文字で初期化した場合は必ず数値の0で初期化されます。
数値の0は文字に置き換えるとNULL文字であり、最初からNULL文字が入っているのです。
そのため要素数を指定しない配列でも要素数1の配列として扱われています。
ただし、配列を初期化していない状態でNULL判定した場合は、よくわからない数値が入っているため、NULL判定しても空文字列かどうか判別できません。
char str1[] = ""; //セーフ
char str2[3] = "";//セーフ
char str3[3]; //アウト
不具合の原因にもなるので、配列を扱う際は何でもいいので初期化しておきましょう。
頻繁に使う場合は関数化
頻繁に空文字かどうか判定する場合は関数化するといいでしょう。
#include<stdio.h>
int isempty(char* str) {
return str[0] == NULL;
}
int main() {
char str[] = "";
if (isempty(str)) {
printf("文字列は空です\n");
}
else {
printf("文字列は空ではありません\n");
}
return 0;
}
関数化することで条件式の演算子ミス(イコールを一つしか書いていないなど)を減らせるのでおすすめです。