C言語で文字列を扱うときは、終端ありきでほとんどの関数が構成されています。
たとえば、最大で12文字入る場合は、13文字分のバッファを用意するのが普通です。
ですが、バッファを12文字しか取らず、最大長だった場合は
終端がないという形態で組む場合というのも往々にしてあります。
void foo(){
//C++だとこの表記駄目らしい
//char name[5] = "Izumi";
char name[5] = {'I','z','u','m','i'};
char message[20] = "hello";
// NGパターン
{
// これだと後ろの文字と連結して10が入ってしまう可能性が!
int len = strlen(name);
// 当然これも駄目
char str[100];
strcpy(str, name);
//stringに代入するときも当然アウト
std::string s = name;
}
// OKパターン
{
// ちゃんと5がはいる
int len = strnlen(name, sizeof(name));
// コピーした先にも終端がつかないことがあるので注意
char str[100];
strncpy(str, name, sizeof(str));
// stringに入れるときはコンストラクタで長さを指定
std::string s(name, sizeof(name));
}
}
この辺は簡単なのですが、何より困るのがprintf。
終端なしの文字列を流し込めればなぁ…と思う人に。
void foo(){
char name[5] = {'I','z','u','m','i'};
char message[20] = "hello";
// 長さとして小数点以下の値を使って指定
printf("%-.5s\n", name);
// 長さを外部から与えたいときは*を使う
printf("%-.*s\n", sizeof(name), name);
}
なお、バッファオーバラン対策にもなりますので、
終端ありの場合もこういう造りにしておくと安心です。
#コメントの指摘を受けてソース部分修正